C 和 C++ 标准中 "expression" 的定义
Definition of an "expression" in the C and C++ standards
我问这个问题是因为我正在更新我的 C 和 C++ 课程材料,我已经有过去的学生问过这个问题...
来自 ISO/IEC 9899:2017 节 6.5 表达式 ¶1(和 C++ 标准中的类似内容):
"An expression is a sequence of operators and operands that specifies computation of a value, or that designates an object or a function, or that generates side effects, or that performs a combination thereof. …"
因为标准编写者显然会仔细选择他们的用词,所以使用短语 "sequence of operators and operands" 似乎有可能误导我。它似乎表明要被视为一个表达式,必须有多个运算符和多个操作数。因此,像 123 这样的文字或像 XYZ 这样的变量不会被认为是表达式,因为没有运算符,如果没有运算符,它们当然不能被认为是操作数。
但是,如果 123 和 XYZ 实际上是表达式,将短语 "sequence of operators and operands" 替换为 "sequence of one or more characters" 或类似的东西不是更准确吗?
请告诉我我误解了标准的内容。
您忘记了在 (6.5.1) 中具有单独定义的主要表达式。
您只是混淆了不同的实体;您提供的定义准确描述了它应该描述的内容。
6.5.1 Primary expressions
Syntax:
primary-expression:
identifier
constant
string-literal
(expression)
and similar in the C++ standard
我不知道 C 标准,但 the C++ standard 将此语句置于 非规范 表示法中。它对C++没有规范价值,所以应该通俗地理解。
是的,C 标准中 "expression" 的定义不完整——但不会导致任何实际问题(除了像我这样挑剔的人)。
您引用的文本中的 "expression" 一词是斜体,这意味着这是该术语的官方定义。从标准的其他部分可以清楚地看出,例如 123
是一个表达式:它是一个 decimal-constant,它是一个 integer-constant,它是一个常量,它是一个主表达式`,它是一个后缀表达式,其中(跳过多个步骤)是一个 表达式.
是不是"a sequence of operators and operands"。没有运算符,这意味着 123
不是操作数(可以参考 operator 和 operand[=37= 的定义来证明) ] 在标准的其他地方)。
实际上,我从未听说过任何人,无论是编译器实现者还是 C 程序员,都因为这个不完整的定义而遇到任何真正的困难。编译器实现者参考语言语法。在阅读标准之前,C 程序员可能对 "expression" 是什么有了很好的了解。
我希望看到 表达式 的定义在新版标准中得到更新。引用语法而不是尝试英语描述的定义将恕我直言是一种改进。
但如果不更新,我们都将毫无问题地继续使用表达式。
至于 C++, 正确地指出 C++ 标准没有像 C 标准那样的 "expression" 的正式定义。它在第 8 条的顶部确实有类似的措辞:“表达式是
指定计算的运算符和操作数的序列。”——但是单词 "expression" 不是斜体并且该句子是 "Note" 的一部分,因此是非规范的。在 C++ 中,标准从句法上定义表达式。
我问这个问题是因为我正在更新我的 C 和 C++ 课程材料,我已经有过去的学生问过这个问题...
来自 ISO/IEC 9899:2017 节 6.5 表达式 ¶1(和 C++ 标准中的类似内容):
"An expression is a sequence of operators and operands that specifies computation of a value, or that designates an object or a function, or that generates side effects, or that performs a combination thereof. …"
因为标准编写者显然会仔细选择他们的用词,所以使用短语 "sequence of operators and operands" 似乎有可能误导我。它似乎表明要被视为一个表达式,必须有多个运算符和多个操作数。因此,像 123 这样的文字或像 XYZ 这样的变量不会被认为是表达式,因为没有运算符,如果没有运算符,它们当然不能被认为是操作数。
但是,如果 123 和 XYZ 实际上是表达式,将短语 "sequence of operators and operands" 替换为 "sequence of one or more characters" 或类似的东西不是更准确吗?
请告诉我我误解了标准的内容。
您忘记了在 (6.5.1) 中具有单独定义的主要表达式。 您只是混淆了不同的实体;您提供的定义准确描述了它应该描述的内容。
6.5.1 Primary expressions
Syntax:
primary-expression:
identifier
constant
string-literal
(expression)
and similar in the C++ standard
我不知道 C 标准,但 the C++ standard 将此语句置于 非规范 表示法中。它对C++没有规范价值,所以应该通俗地理解。
是的,C 标准中 "expression" 的定义不完整——但不会导致任何实际问题(除了像我这样挑剔的人)。
您引用的文本中的 "expression" 一词是斜体,这意味着这是该术语的官方定义。从标准的其他部分可以清楚地看出,例如 123
是一个表达式:它是一个 decimal-constant,它是一个 integer-constant,它是一个常量,它是一个主表达式`,它是一个后缀表达式,其中(跳过多个步骤)是一个 表达式.
是不是"a sequence of operators and operands"。没有运算符,这意味着 123
不是操作数(可以参考 operator 和 operand[=37= 的定义来证明) ] 在标准的其他地方)。
实际上,我从未听说过任何人,无论是编译器实现者还是 C 程序员,都因为这个不完整的定义而遇到任何真正的困难。编译器实现者参考语言语法。在阅读标准之前,C 程序员可能对 "expression" 是什么有了很好的了解。
我希望看到 表达式 的定义在新版标准中得到更新。引用语法而不是尝试英语描述的定义将恕我直言是一种改进。
但如果不更新,我们都将毫无问题地继续使用表达式。
至于 C++,