В каких версиях C блок в круглой скобке используется для возвращения допустимого значения?

Большинство эквайеров (например, Chase Paymentech) предоставляют услугу, которая отправляет вам (и покупателю, если хотите) электронное письмо об истечении срока действия карты & amp; куча других вещей (например, достигнут кредитный лимит) - поэтому вам не нужно хранить какую-либо информацию, за исключением, может быть, 4 последних цифр для целей распознавания.

18
задан Jonathan Leffler 3 March 2015 в 15:16
поделиться

3 ответа

Если вы удалите круглые скобки, он не будет компилироваться.

Без круглых скобок компилятор будет рассматривать это как агрегированный блок инициализации и завершится ошибкой, когда увидит ключевое слово int . У вас не может быть ключевых слов в блоках инициализатора.

6.7.8 Инициализация

11 Инициализатор для скаляра должен быть единственным выражением, необязательно заключенным в фигурные скобки. В начальное значение объекта - это значение выражения (после преобразования); того же типа применяются ограничения и преобразования, как для простого присваивания, принимая тип скаляра быть неполной версией объявленного типа.

6.2.5 Типы

21 Арифметические типы и типы указателей вместе называются скалярными типами. Массив и Типы структур вместе называются агрегатными типами.


Могу ли я ожидать, что это будет работать в большинстве компиляторов c?

Нет. Похоже на нестандартное расширение GNU.

Кроме того, как называется эта конструкция?

Интересно, а есть ли вообще. Собственно, это похоже на то, что обычно делают макросы.

7
ответ дан 30 November 2019 в 06:46
поделиться

Это расширение GCC :

Составной оператор, заключенный в круглые скобки, может отображаться как выражение в GNU C. Это позволяет использовать циклы, переключатели и локальные переменные внутри выражения.

Напомним, что составной оператор - это последовательность операторов, заключенная в фигурные скобки; в этой конструкции круглые скобки заключают фигурные скобки. Например:

  ({int y = foo (); int z;
 если (y> 0) z = y;
 иначе z = - y;
z; })

- допустимое (хотя и немного более сложное, чем необходимо) выражение для абсолютного значения foo () .

Последним элементом составного оператора должно быть выражение, за которым следует точка с запятой; значение этого подвыражения служит значением всей конструкции. (Если последним в фигурных скобках вы используете какой-либо другой оператор, конструкция имеет тип void и, следовательно, фактически не имеет значения.) ...

31
ответ дан 30 November 2019 в 06:46
поделиться

Вы можете ожидать, что он будет работать в большинстве версий GCC.

Вы можете ожидать, что он не будет работать почти нигде - это расширение GCC.

Раздел руководства GCC, который описывает эту функцию, называется «Операторы и объявления в выражениях»:

Составной оператор, заключенный в круглые скобки, может отображаться как выражение в GNU C.

Позже он говорит:

Любые временные файлы созданный в операторе внутри выражения оператора будет уничтожен в конце заявления. Это делает выражения операторов внутри макросов немного отличается от вызовов функций.

Итак, «выражение выражения» похоже на имя, используемое в документации.

7
ответ дан 30 November 2019 в 06:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: