Что такое синтаксис С++, который помещает блок, окруженный фигурной скобкой, где ожидается выражение?

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

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

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

Ответ 1

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

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

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

Выражения выписки:

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

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

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

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

Ответ 2

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

Ответ 3

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

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

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

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

Ответ 4

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