C++ 表达式何时是良构的?

9

在阅读C++标准时,我遇到了很多这样的语句:

表达式X必须是良好形式的。

我对自己说:“好吧,直观上你知道什么是良好形式的表达式,但你能否给出一个正式的解释,说明什么使得C++表达式成为良好形式的表达式?”

我搜索了一下,并没有找到任何正式解释。所以我的问题是:

问:C++中良好形式表达式的定性特征是什么?


@sharth 我不会这么认为:我会期望它与“格式不正确”相反。一个表达式是否符合C++标准中的规则通常无法由计算机验证。 - user743382
@sharth,我指的不是一个 C++ 程序,而是一个 C++ 表达式。 - 101010
2
@sharth 嘿,同时,标准从未明确规定程序何时是格式良好的,只有当它格式不良时才会指出。无论如何,我写下我的评论是因为你谈到了C++语言的规则,而不仅仅是可诊断的规则,这通常是无法验证的:一个表达式可能不是格式不良的,但仍然具有未定义的行为,在这种情况下,它不遵循C++语言的规则。 - user743382
@sharth:计算机绝对可以确定C++程序是否格式正确。 - Lightness Races in Orbit
@sharth:不,程序是否格式良好在编译时就已知。用户输入与此无关。 - Lightness Races in Orbit
2个回答

8
C++标准中没有定义“良好形式表达式”,尽管它实际上使用了这个词语。但有“良好形式程序”的定义。我猜“良好形式表达式”可以理解为不会使程序变得非良好形式的表达式(在1.3.9中定义为“不良好形式”)。

“良好形式的表达式是指不会使程序失效的表达式”:这非常接近我自己给出的直觉解释。但是,我们真的可以从中推导出一些定性特征吗?例如,1. 良好形式的表达式可编译。2. …等等? - 101010
标准并未定义任何类似的内容,并仅在特定上下文中使用该短语,例如“不包括头文件<new>的new-expression是良好形式”。我真的不知道您列表中的第二项是什么,“可编译”意味着“按照标准构建”。 - Wojtek Surowka
“well-formed expression”的语法和语义规则在标准的S5中给出。它们大约包括40页,很难用更少的篇幅进行总结。 - david.pfx

6

一个格式良好的表达式必须符合标准中定义的“表达式”的语法,并且必须符合语义规则,例如不使用未声明的名称,或在相同范围内重新声明具有不同含义的名称。

i = 0

X::i++

上述表达式在语法上是有效的,但如果i未声明或为const,或X不是命名空间或类类型,或X::i未声明,或X::i不支持后置递增,则它们不符合形成良好表达式的语义要求。
问:C ++中好的表达式有哪些定性特征?
请参阅Clauses 1至15。你不能将整个C ++语言简化为一个简单的列表。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接