11

以下代码有效吗?如果有,范围是x多少?

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

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

4

2 回答 2

25

GCC 4.7.2 向我们展示了,虽然代码是有效的,但范围x仍然只是有条件的

范围

这是因为:

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

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

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

有效性

它在语法方面是有效的,因为选择语句的产生因此是 (by [C++11: 6.4/1]):

选择语句:(条件语句
  if条件语句语句
  if条件)语句 else
  switch

并且int x = 42;是一个陈述(by [C++11: 6/1]):

语句
  标记语句
  属性说明符序列选择 表达式语句
  属性说明符序列选择 复合语句
  属性说明符序列选择 选择语句
  属性说明符序列选择 迭代语句
  属性说明符序列选择 跳转语句
  声明语句
  属性说明符序列选择 尝试块

于 2013-03-22T11:16:06.677 回答
2

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

于 2013-03-22T11:20:09.947 回答