if语句中的声明奇怪的行为(C ++)

时间:2016-11-13 04:38:07

标签: c++ clang++

我有以下代码:

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上使用变量时,它可能不会引用在父作用域中声明的具有相同名称的变量,而是指的是正在定义的变量...

3 个答案:

答案 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) 它正在创建新变量,并可能返回存储在该位置的旧数据。