【问题标题】:A branch of an if-statement cannot be just a declaration?if 语句的一个分支不能只是一个声明吗?
【发布时间】:2014-05-26 10:10:38
【问题描述】:

if 语句的分支不能只是一个声明。如果我们需要在分支中引入名称,则必须将其包含在块中。-----by TC++PL 4th。

void f1(int i)
{
    if (i)
        int x = i + 2;        //error: declaration of if-statement branch
}

但它在 VS2013 和 GCC4.8 的编译器上是有意义的。

工作草案(N3242)告诉我

如果选择语句中的子语句是单个语句而不是复合语句,就好像它被重写为包含原始子语句的复合语句。

代码可以等效地改写为:

void f1(int i)
{
    if (i) {
        int x = i + 2;
    }
}

因此在 if 语句之后,x 不再在范围内。

那么标准是什么?

【问题讨论】:

  • "但它在 VS2013 和 GCC4.8 的编译器上是有意义的。" - 不,它没有,只是这些编译器接受了废话。
  • 可能后者将成为新标准,即使它对我来说看起来很丑:)
  • 你的问题不太清楚。
  • @user3477950:我认为工作草案和当前标准之间在这方面没有任何相关差异——或者在任何 C++草案或标准中。如果你知道一个,请引用它。
  • @CantChooseUsernames:该示例没有用,但假设声明的目的是调用构造函数和/或析构函数。这不一定是好风格,但完全合法。

标签: c++ if-statement syntax grammar


【解决方案1】:

从句法上讲,声明可以是语句。具体来说,它是一个声明语句

(我说“可以”是因为并非所有声明都是声明。例如,文件范围内的声明不能合法出现的声明不是声明。)

由于if 语句的语法是:

if ( condition ) statement

if ( condition ) statement else statement

if 语句的任一分支作为声明都是完全合法的。

在您的示例中,它并不是特别有用,但我可以轻松想象您可能想要声明一个对象以执行其构造函数和/或析构函数。

if 语句的分支不能只是一个声明。如果我们需要 要在分支中引入名称,必须将其括在 块.-----由 TC++PL 4th.

我有一份“C++ 编程语言”的 PDF 副本,第 4 版,第 4 次印刷,日期为 2015 年 4 月。9.3 中的声明“声明就是声明”。还在那里。这种说法是不正确的,或者至少是不完整的。声明:

if 语句的分支不能只是一个声明。如果我们需要 要在分支中引入名称,必须将其包含在块中。

不再存在;它已更新为:

if 语句分支的声明范围就是 分支。如果我们需要在一个分支中引入一个名字,它必须是 包含在一个块中(第 9.2 节)。

这不是严格正确的,但是如果你想在一个分支中声明,你需要将它包含在一个块中,如果你想在一个语句中引用它。仅由声明组成的分支是合法的,但通常没有用处。

(顺便说一句,C 有不同的规则。自 1999 年标准以来,C 允许混合声明和语句,但它不将声明视为语句,因此在 C 中,声明 不能 if 语句的分支。)

【讨论】:

  • 4th 还声明声明是声明。我现在真的很困惑。“声明就是声明。”声明->声明声明->块声明。但是,声明还包含其他声明(例如我们的模板声明,空声明..等)。
  • 所以,“一个声明就是一个声明。”,可能意味着“一个块声明是一个声明”,但不是所有的声明?
  • 对,不是所有的声明都是声明,只有那些出现在声明合法的地方的声明。例如,在任何函数定义之外的文件范围内的声明都不是语句。
  • 现在我知道你第一句话中“可以”的意思了。谢谢!
  • @Huang-zh:我以为我的答案上有一个绿色的复选标记,但现在没有了。你打算接受这个作为正确答案吗? (是否这样做完全取决于您。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-11-29
  • 2021-03-04
  • 1970-01-01
  • 2013-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多