Что это за синтаксис C++, который помещает блок, окруженный скобками, где ожидается выражение?
я наткнулся на эту странную программу на C++.
#include <iostream>
using namespace std;
int main()
{
int a = ({int x; cin >> x; x;});
cout << a;
}
может кто-нибудь объяснит, что происходит? Как называется эта конструкция?
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