【问题标题】:When is a C++ expression well formed?什么时候 C++ 表达式格式正确?
【发布时间】:2014-08-15 23:20:06
【问题描述】:

略读 C++ 标准,我在很多情况下得出以下结论:

X 的表达式格式应该是正确的。

我对自己说:“好吧,凭直觉你知道什么是格式良好的表达式,但是你能正式解释什么使 C++ 表达式成为格式良好的表达式吗?”。

我进行了一些搜索,但没有找到任何对此事给出正式解释的内容。所以这是我的问题:

问:在 C++ 中格式良好的表达式有哪些定性特征?

【问题讨论】:

  • @sharth 我不会:我希望它与格式错误的相反。表达式是否符合 C++ 标准中的规则通常无法通过计算机进行验证。
  • @sharth 我指的不是 C++ 程序,而是 C++ 表达式。
  • @sharth Heh,但与此同时,该标准从未真正指定程序何时格式正确,仅在程序格式错误时。无论如何,我写了我的评论,因为你谈到了 C++ 语言的规则,而不仅仅是可诊断的规则,而且这通常是不可验证的:一个表达式可能不是格式错误的,但仍然有未定义的行为,在这种情况下,它不会'不遵循 C++ 语言的规则。
  • @sharth:计算机绝对可以确定 C++ 程序是否格式正确。
  • @sharth:不,程序是否格式正确在编译时就知道了。用户输入与它无关

标签: c++ c++11 language-lawyer c++14


【解决方案1】:

C++ 标准没有定义格式良好的表达式,尽管它实际上使用了这个短语。 格式良好的程序有定义

1.3.26 [defns.well.formed] 格式良好的程序 根据语法规则、可诊断语义规则和单一定义规则(3.2)构造的C++程序。

我想我们可以假设 格式良好的表达式 是一个不会使程序格式不正确的表达式(在 1.3.9 中定义为 格式不正确)。

【讨论】:

  • well-formed expression is an expression which does not make the program ill-formed:这非常接近我给自己的直观解释。但实际上,我们能否从中推断出一些定性特征(例如,1. 格式良好的表达式是可编译的。2...等)?
  • 该标准没有定义类似的内容,并且仅在特定上下文中使用该短语,例如“不包括标题 的新表达式格式正确”。我真的不知道您列表中的第 2 项是什么,“可编译”的意思是“按照标准构建”。
  • well-formed expression 的语法和语义规则在标准的 S5 中给出。它们大约有 40 页,很难用更少的内容来概括。
【解决方案2】:

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

i = 0

X::i++

上面的表达式在语法上是有效的,但是如果i没有被声明,或者是const,或者X不是一个命名空间或者类类型,或者X::i没有被声明,或者@987654326 @ 不支持后自增,则无法满足格式良好表达式的语义要求。

问:C++ 中格式良好的表达式有哪些定性特征?

请参阅第 1 到 15 条。您不能将整个 C++ 语言简化为一个简单的列表。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-25
    • 1970-01-01
    • 2011-03-30
    • 1970-01-01
    • 2013-04-07
    • 1970-01-01
    相关资源
    最近更新 更多