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



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



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


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

593   4  

4 ответов:

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

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

IBM IBM XL C / C++ v7. 0 также поддерживает выражения операторов и это doccumentation объясняет их точно:

Заявление Выражений:

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

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

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

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

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

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

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

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

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

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

Comments

    Ничего не найдено.