Блоки анонимного кода в c

Что означает такое заявление?

int x  = ( { int a; scanf( "%d", &a ); a ; } ) ;

Он компилируется и работает эквивалентно:

int x;
scanf( "%d", &x );

Похоже на какой-то анонимный вызов функции или что-то в этом роде, но я не уверен. Я не сталкивался с утверждениями, подобными ({}), и не могу найти никаких объяснений в Интернете. Любая помощь будет очень признательна, спасибо :)

Контекст:

Это код, который вы получаете, когда раскрываются макросы в следующем коде:

#define SI ({int a;scanf("%d",&a);a;});
int x = SI;

Это код, используемый кем-то на соревнованиях по программированию.


person arya    schedule 27.10.2011    source источник
comment
Это соревнование по программированию IOCCC?   -  person ObscureRobot    schedule 27.10.2011
comment
@ObscureRobot: на самом деле, на соревнованиях по программированию вы видите много таких макросов, они просто для более простого и быстрого чтения ввода (время часто очень ограничено, поэтому вы не хотите тратить его на красивые обертки). Это не обязательно должна быть компиляция IOCCC, я сам написал достаточно уродливого кода в таких компах :p. Здесь, вероятно, какой-то идиот думал, что макросы быстрее, чем встроенные...   -  person KillianDS    schedule 27.10.2011
comment
Реальный вопрос: почему бы не сделать это встроенной функцией...?   -  person Matthieu M.    schedule 27.10.2011
comment
возможный дубликат странного синтаксиса C++   -  person Luchian Grigore    schedule 27.10.2011


Ответы (1)


Это выражение оператора.
Это расширение компилятора, поддерживаемое GCC, и оно не является стандартным C++, поэтому оно не является переносимым.
Если вы скомпилируете свой код с флагом -pedantic, он тебе так скажут.

В этом моем ответе подробно рассказывается об этом.

person Alok Save    schedule 27.10.2011
comment
Только что заметил, что Q был повторно помечен только C, поэтому, чтобы было ясно, Statement Expressions не является стандартным C или стандартным C++. - person Alok Save; 27.10.2011
comment
Что можно упомянуть, так это причину его использования. Для пустых макросов, требующих нескольких операторов, вы можете использовать конструкцию do-while-loop, чтобы макрос вел себя как вызов функции. Это переносимо, но когда вам нужно вернуть значение, это единственный возможный способ добиться этого (афаик). - person flolo; 27.10.2011