【发布时间】:2019-10-26 21:08:46
【问题描述】:
我问这个问题是因为我正在更新我的 C 和 C++ 课程资料,而且我有过去的学生问过这个问题......
来自 ISO/IEC 9899:2017 第 6.5 节表达式¶1(在 C++ 标准中类似):
“表达式是一系列操作符和操作数,用于指定值的计算,或指定对象或函数,或产生副作用,或执行它们的组合。... "
因为标准编写者显然会仔细选择他们的词,所以使用“运算符和操作数的序列”这个短语似乎可能会误导我。这似乎表明要被视为一个表达式,必须有多个运算符和多个操作数。因此,像 123 这样的文字或像 XYZ 这样的变量不会被视为表达式,因为没有运算符,如果没有运算符,它们当然不能被视为操作数。
但是,如果 123 和 XYZ 实际上是表达式,那么将短语“运算符和操作数的序列”替换为“一个或多个字符的序列”或类似的东西不是更准确吗?
请告诉我我对标准的说明有什么误解。
【问题讨论】:
-
虽然 C 和 C++ 在它们的规范中有一些相似的语法和有时相似的措辞,但它们仍然是不同的语言,规范中的差异会导致程序的语义差异很大。因此,在讨论这两种语言时请小心,因为看起来相似的内容可能根本不相似。
-
@Someprogrammerdude:这两个标准都使用了我所质疑的完全相同的短语。你能评论我的话题吗?
-
您的陈述“似乎表明要被视为一个表达式,必须有多个运算符和多个操作数”对我来说似乎是错误的——一系列 foo 的长度可以是 1(在这种情况下只有一个 foo)或什至长度为 0(在这种情况下没有 foo)全部)-但是鉴于标准如何定义“操作数”,您的评论“如果没有运算符,它们当然不能被视为操作数”是一个很好的评论。这似乎是定义中的一个小错误。
-
看看 6.5.1 主要表达式
-
@KeithThompson:好的——我不确定你要叫什么
123,但它看起来很像一个操作数——尽管它没有应用任何运算符给它。我不想扩大讨论。我不认为这有帮助。如果您的“我不认为”评论是针对我的,那么您 100% 错误地引用了我所说的话,因此将我在这种情况下不会说的话放入我的嘴里。 (我看到我确实在我想要“或”的地方打错了“矿石”——哦,好吧)。
标签: c++ c expression language-lawyer standards