Что это за синтаксис C ++, который помещает блок в скобках, где ожидается выражение? - PullRequest
75 голосов
/ 10 июня 2011

Я столкнулся с этой странной программой на C ++.

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

Может кто-нибудь объяснить, что происходит? Как называется эта конструкция?

Ответы [ 4 ]

64 голосов
/ 10 июня 2011

Назначает пользовательское значение ввода a и распечатывает его.это делается с помощью Statement Expression.

Выражения операторов: расширение компилятора gnu не поддерживается стандартами C / C ++.Следовательно, любой код, который использует выражение оператора, не соответствует стандарту и не является переносимым.

IBM IBM XL C / C ++ v7.0 также поддерживает выражения операторов, и его документация объясняет их точно:* Выражения операторов:

Составной оператор - это последовательность операторов, заключенная в фигурные скобки.В GNU C составной оператор в скобках может отображаться как выражение в так называемом Statement expression.

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

Значением выражения выражения является значение последнегопростое выражение, чтобы появиться во всей конструкции.Если последний оператор не является выражением, тогда конструкция имеет тип void и не имеет значения.

Всегда компилируйте свой код, выбирая сэндард в GCC, используйте один из параметров -ansi-std=c90 или -std=iso9899:1990, -std=c++03, -std=c++0x;чтобы получить всю диагностику, требуемую стандартом, вы должны также указать -pedantic (или -pedantic-errors, если хотите, чтобы они были ошибками, а не предупреждениями)

54 голосов
/ 10 июня 2011

Это расширение GCC.Скомпилируйте ваш код с флагом -pedantic, если вы хотите избавиться от подобных вещей (а вы действительно делаете хотите).

18 голосов
/ 10 июня 2011

Создает встроенную область видимости, объявляет x внутри нее, считывает ее из стандартного ввода, и весь оператор в итоге получает значение x, которое присваивается a.

Оператор запятойработает аналогично, хотя не требует отдельной области видимости.Например:

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

сделает то же самое.Все операторы, связанные с запятыми, будут выполняться последовательно, а результат всего выражения будет установлен на значение самого правого операнда.

13 голосов
/ 10 июня 2011

Я не верю, что это стандартный C ++.Это, вероятно, специфичное для компилятора расширение, которое позволяет внутренней области видимости получить значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...