以下代码有效吗?如果有,范围是x
多少?
int main()
{
if (true) int x = 42;
}
我的直觉说,它没有创建范围,if
因为它后面没有实际的块({}
)。
以下代码有效吗?如果有,范围是x
多少?
int main()
{
if (true) int x = 42;
}
我的直觉说,它没有创建范围,if
因为它后面没有实际的块({}
)。
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]
):
语句:
标记语句
属性说明符序列选择 表达式语句
属性说明符序列选择 复合语句
属性说明符序列选择 选择语句
属性说明符序列选择 迭代语句
属性说明符序列选择 跳转语句
声明语句
属性说明符序列选择 尝试块
我的 Visual Studio 说你的变量 x 的生命周期非常短——就在我们在运算符 if 中时,所以当我们超出 if 条件时,x 将被销毁,这样声明变量绝对没有意义。