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