【问题标题】:Is a declaration valid inside an if block with no actual block?没有实际块的 if 块内的声明是否有效?
【发布时间】:2013-03-22 11:14:47
【问题描述】:

以下代码有效吗?如果有,x的范围是什么?

int main()
{
   if (true) int x = 42;
}

我的直觉说if 没有创建范围,因为它后面没有实际的块 ({})。

【问题讨论】:

  • 嗯,我的直觉是范围不依赖于存在的 {},或者换句话说,对于单个语句,{} 的存在是可选的。
  • 它应该只存在于条件范围内,单个语句不需要{}
  • @NicholasSmith 但是你能证明吗?
  • @LightnessRacesinOrbit:因为我不一定想在真正的代码行上中断。例如,我可能想在foo[i]==356 时进入一个循环;添加两行代码去if (foo[i]==256) int spug=7;(它总是spug=7,我不知道为什么)让我在我想要的地方进入一个复杂的循环。

标签: c++ language-lawyer


【解决方案1】:

GCC 4.7.2 向我们展示了,虽然代码是有效the scope of x is still simply the conditional

范围

这是由于:

[C++11: 6.4/1]: [..] selection-statement 中的子语句(每个子语句,以if 语句的else 形式)隐式定义块范围。 [..]

因此,您的代码等同于以下内容:

int main()
{
   if (true) {
      int x = 42;
   }
}

有效期

就语法而言,它是有效的,因为选择语句的产生式因此是([C++11: 6.4/1]):

选择声明
if ( 条件 ) 声明
if ( 条件 ) 声明 else 声明
switch ( 条件 ) 声明

int x = 42; 是一个声明[C++11: 6/1]):

声明
标签声明
属性说明符序列opt表达式语句
attribute-specifier-seqopt复合语句
attribute-specifier-seqoptselection-statement
attribute-specifier-seqopt迭代语句
attribute-specifier-seqopt跳转语句
声明声明
attribute-specifier-seqopttry-block

【讨论】:

  • @Downvoter:请解释为什么您认为这个答案不正确。我期待听到您的意见。谢谢。
【解决方案2】:

我的 Visual Studio 说变量 x 的生命周期非常小 - 就在我们在运算符 if 中时, 所以当我们超出 if 条件时 x 将被销毁,并且绝对没有任何意义 像这样声明变量。

【讨论】:

  • 你的英语很好,顺便说一句。
  • 变量构造函数有副作用怎么办? (我知道,我很挑剔,但是绝对没有意义不是100%正确的)
  • VS 没有“副作用”,只是在我们退出“if”后变量 x 被销毁
  • 不,你不明白@Anton。这里我们正在构建int,但如果我这样做了,例如if(cond) ObjWithSideEffectsCtor o;,那就很重要了。
  • 或者,例如,如果你做了链接,比如new internetAPIhandlerobject().sendAPImessage("some message");
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-07-17
  • 2018-03-28
  • 1970-01-01
  • 2015-06-09
  • 1970-01-01
  • 1970-01-01
  • 2015-05-02
相关资源
最近更新 更多