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

StackOverflow https://stackoverflow.com/questions/6305396

Вопрос

Я наткнулся на эту странную программу 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 ++. Вероятно, это расширение, специфичное для компилятора, которое позволяет внутренней области оценивать значение.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top