식이 예상되는 곳에 중괄호로 둘러싸인 블록을 배치하는이 C ++ 구문은 무엇입니까? ++ 프로그램을 보았습니다. #include

이 이상한 C ++ 프로그램을 보았습니다.

#include <iostream>
using namespace std;
int main()
{
  int a = ({int x; cin >> x; x;});
  cout << a;
}

아무도 무슨 일이 일어나고 있는지 설명 할 수 있습니까? 이 구조는 무엇이라고 부릅니까?



답변

사용자 입력 값을 할당 a하고 출력합니다. 를 사용하여 수행됩니다 Statement Expression.

문 표현식은 gnu gcc 컴파일러 확장 이며 C / C ++ 표준에서 지원되지 않습니다. 따라서 명령문 표현식을 사용하는 코드는 표준을 준수하지 않으며 이식성이 없습니다.

IBM IBM XL C / C ++ v7.0은 또한 Statement Expressions를 지원하며 문서는이를 적절하게 설명합니다.

문 표현식 :

복합 명령문은 중괄호로 묶인 일련의 명령문입니다. GNU C에서 괄호 안의 복합 명령문은 Statement expression.

         .--------------.
         V              |
>>-(--{----statement--;-+--}--)--------------------------------><

문 식의 값은 전체 구문에 나타나는 마지막 단순 식의 값입니다. 마지막 문이식이 아니면 구성은 void 유형이고 값이 없습니다.

항상, GCC의 sandard를 선택하여 코드를 컴파일 옵션 중 하나를 사용 -ansi, -std=c90또는 -std=iso9899:1990, -std=c++03, -std=c++0x, 표준에서 요구하는 모든 진단을 얻으려면 또한 지정해야합니다 -pedantic(또는 -pedantic-errors경고가 아닌 오류가되도록 원하는 경우).


답변

GCC 확장입니다. 사용하여 코드를 컴파일 -pedantic이 같은 물건을 제거 할 (그리고 당신이 정말로 경우 플래그를 않습니다 원하는).


답변

인라인 범위를 만들고 그 x안에서 선언 하고 표준 입력에서 읽고 전체 문 x이에 할당 된로 평가 됩니다 a.

쉼표 연산자는 별도의 범위가 필요하지 않지만 비슷하게 작동합니다. 예를 들면 :

int x;
int a = (cin >> x, x);

똑같이 할 것입니다. 쉼표로 연결된 모든 문은 순차적으로 실행되며 전체 표현식의 결과는 맨 오른쪽 피연산자의 값으로 설정됩니다.


답변

이것이 표준 C ++라고 생각하지 않습니다. 내부 범위를 값으로 평가할 수있는 컴파일러 관련 확장 일 수 있습니다.


답변