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
永远不会打印在您的代码中,因为它是在父作用域中声明的,并被内部作用域中的那些覆盖。
我有以下代码:
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
永远不会打印在您的代码中,因为它是在父作用域中声明的,并被内部作用域中的那些覆盖。