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