이 이상한 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 ++라고 생각하지 않습니다. 내부 범위를 값으로 평가할 수있는 컴파일러 관련 확장 일 수 있습니다.