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

Declaration in if statement weird behaviour (C++)

我有以下代码:

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

在 C 中,这个 if (int X = X) 是完全错误的,因为 if 语句需要一个控制表达式 - 而不是一个声明。

6.8.4.1 The if statement

The controlling expression of an if statement shall have scalar type.

我不确定 clang,但是 gcc 给这段代码一个明显的错误(不是警告),即使没有任何编译器标志(即没有 -Wall -Wextra

error: expected expression before ‘int’

改变所有 ( Int X =X) 到 (X) 它正在创建新变量并可能返回存储在该位置的旧数据。

当您说 int X = X 时,两个 X 指的是同一个 int。也就是说,您在该行中声明的那个。所以你正在初始化 X 本身,这是未定义的行为,因为它(当然)还没有被初始化。您用 1 初始化的 X 永远不会打印在您的代码中,因为它是在父作用域中声明的,并被内部作用域中的那些覆盖。