식이 예상되는 곳에 중괄호로 둘러싸인 블록을 배치하는이 C ++ 구문은 무엇입니까?


78

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

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

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


51
그것은 "코드 난독 화"입니다
BЈовић 2011-06-10

2
@VJo :이 "({})"구조가 무엇이라고 부르나요? 익명 함수와 비슷합니까?
Koshimitsu 2011 년

1
+1 Blimey, 나는 이것을 전에 본 적이 없습니다 . 그것의 GNU C / C ++ 특정 ... 너무 나쁜
sehe

1
하나는 : 람다 함수와 같은 거의 비슷합니다
iammilind

18
그것은 나뿐입니까, 아니면 다른 컴파일러보다 gcc에 더 많은 비표준 확장이 있습니까?
David Heffernan 2011-06-10

답변:


69

사용자 입력 값을 할당 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경고가 아닌 오류가되도록 원하는 경우).


56

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


10
많은 사람들이 듣지 않았거나 사용하지 않은 것이 어차피 표준이 아니라는 것을 알게 된 후 많은 사람들이 안도했기 때문에 투표가 너무 많은 것 같습니다.
Blagovest Buyukliev 2011 년

18

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

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

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

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


"({})"에 대한 특정 이름이 있습니까?
Koshimitsu 2011 년

@Koshimitsu : 연산자의 조합이기 때문에 없습니다 (그렇게 부르고 싶다면). 이 경우 중괄호 {}는 범위의 시작 ({) 및 끝 (})을 정의합니다. 일반 대괄호는 범위의 정의와 반환 값을 캡슐화하기 위해 있습니다. 이 경우 이러한 일반 대괄호를 생략 할 수 있는지 여부는 확실하지 않지만 가능할 것으로 예상합니다.
Rycul 2011-06-10

1
@Koshimitsu : 저는 C ++에 익숙하지 않지만 C에서는 완벽하게 합법적이며 여러 번 사용했습니다.
Blagovest Buyukliev 2011 년

1
@Neil : 글쎄요, 아마도 gcc가 제가 사용하는 유일한 C 컴파일러이기 때문에 오해를 받았습니다.
Blagovest Buyukliev 2011 년

13

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


1
@Doc : 말도 안돼. 그것은 표준 C가 아닙니다. C ++ 0x에 추가되었을 수도 있지만 모르겠습니다.
Oliver Charlesworth 2011 년

13
@Doc 당신은 착각입니다. 표준 C ++도 아니고 표준 C도 아닙니다. "statement expression"이라는 GCC 확장입니다.
Johannes Schaub-litb 2011 년

나는 그것이 믿지 않는다. Visual Studio는 확실히 그것을 받아들이지 않을 것입니다.
Puppy

3
@mathepic : 둘 다 ... (올바른 옵션없이) 분명히 GCC, 따라서 질문 여기에 혼란입니다
rubenvb
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.