我有以下代码:
int X = 1;
if (int X = X)
{
printf("%d\n", X);
if (int X = X)
{
printf("%d\n", X);
}
}
我的期望是X应该是1,1。但是,输出是:
1818935350
32767
任何人都知道这里发生了什么?用clang-800.0.42.1编译
编辑:我尝试了下面的代码并进行了一些调整,现在它的行为符合我的预期。
int X = 1;
if (int Y = X)
{
printf("%d\n", Y);
if (int Z = X)
{
printf("%d\n", Z);
}
}
有一种猜测是当你在if语句中的声明的RHS上使用变量时,它可能不会引用在父作用域中声明的具有相同名称的变量,而是指的是正在定义的变量...
答案 0 :(得分:4)
当您说int X = X
时,两个X都引用相同的int
。也就是说,你正在那条线上声明的那个。因此,您正在使用自身初始化X
,这是未定义的行为,因为它(当然)尚未初始化。您初始化为1的X
永远不会打印在您的代码中,因为它在父作用域中声明并被内部作用域中的作用所遮蔽。
答案 1 :(得分:0)
在C中,这个if (int X = X)
是完全错误的,因为if
语句需要一个控制表达式 - 但不是声明。
6.8.4.1 if语句
if语句的控制表达式应具有标量类型。
我不确定clang
,但gcc
即使没有任何编译器标志(即没有-Wall -Wextra
),也会给这段代码一个明显的错误(不是警告)
错误:'int'之前的预期表达式
答案 2 :(得分:-1)
改变所有 (Int X = X)到(X) 它正在创建新变量,并可能返回存储在该位置的旧数据。