Определение «выражения» в стандартах C и C ++ - PullRequest
1 голос
/ 27 октября 2019

Я задаю этот вопрос, потому что я обновляю материалы моего курса C и C ++, и у меня были прошлые студенты, спрашивавшие об этом ...

Из ISO / IEC 9899: 2017, раздел 6.5 Выражения ¶1 (и аналогично стандарту C ++):

"Выражение представляет собой последовательность операторов и операндов, которая определяет вычисление значения или обозначает объект или функциюили это вызывает побочные эффекты, или это вызывает их комбинацию.… "

Поскольку авторы стандартов, очевидно, тщательно подбирают свои слова, использование фразы" последовательность операторов и операндов "кажется потенциально вводящим в заблуждениемне. Кажется, это указывает на то, что для того, чтобы считать выражение, должно быть более одного оператора, а также более одного операнда. Таким образом, литералы, такие как 123, или переменные, такие как XYZ, не будут считаться выражениями, потому что нет оператора, и они, безусловно, не могут считаться операндами, если нет оператора.

Однако, если 123 и XYZ на самом деле являются выражениямине будет ли более точной замена фразы «последовательность операторов и операндов» на «последовательность одного или нескольких символов» или чего-то подобного?

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

Ответы [ 3 ]

4 голосов
/ 27 октября 2019

и аналогичные в стандарте C ++

Я не знаю о стандарте C, но стандарт C ++ помещает это утверждение в не-нормативная запись. Он не имеет нормативного значения для C ++, поэтому его следует читать как разговорный.

3 голосов
/ 27 октября 2019

Вы забыли о Первичных выражениях, которые имеют отдельное определение в (6.5.1). Вы просто перепутали разные сущности;приведенное вами определение точно описывает то, что должно описываться.

6.5.1  Primary expressions
Syntax:
   primary-expression:
     identifier
     constant
     string-literal
     (expression)
1 голос
/ 27 октября 2019

Да, определение «выражения» в стандарте C неполно, но не так, чтобы вызывать какие-либо реальные проблемы (кроме как у привередливых людей, таких как я).

Слово «выражение»в цитируемом вами тексте выделен курсивом, что означает, что это официальное определение термина. Из других частей стандарта ясно, что 123, например, является выражением: это десятичная константа , которая является целочисленной константой , которая является константа , которая является первичным выражением `, которая является постфиксным выражением , которая (пропуская несколько шагов) является выражением .

Это , а не"последовательность операторов и операндов". Нет оператора, который подразумевает, что 123 не является операндом (это можно продемонстрировать, обратившись к определениям оператора и операнда в другом месте в стандарте).

На практике я никогда не слышал ни о ком, ни о компиляторе, ни о компиляторе, ни о программисте на Си, у которого были бы какие-либо реальные трудности из-за этого неполного определения. Реализаторы компилятора ссылаются на грамматику языка. Программисты на C, вероятно, достаточно хорошо понимают, что такое «выражение», прежде чем читать стандарт.

Мне бы хотелось, чтобы определение expression было обновлено в новой редакции стандарта. ,Определение, которое относится к грамматике, а не к английскому описанию, ИМХО было бы улучшением.

Но если оно не будет обновлено, мы все продолжим использовать выражения без проблем.

Что касается C ++, Ответ Никола Боласа правильно указывает на то, что стандарт C ++ не имеет формального определения «выражения», как в стандарте C. Он имеет аналогичную формулировку в верхней части раздела 8: «Выражение представляет собой последовательность операторов и операндов, которые определяют вычисление». - но слово «выражение» не выделено курсивом, и это предложение является частью «Записки» и поэтому ненормативно. В C ++ стандарт определяет синтаксические выражения.

...