为什么在这个C++代码中i == 0的值?

Ren*_*Ren 16 c++ undefined-behavior

我对以下代码感到困惑:

#include <iostream>

int i = 1;
int main()
{
    int i = i;
    std::cout << "i: " << i << "\n";
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

i: 0
Run Code Online (Sandbox Code Playgroud)

我曾预计运行上面的代码会打印出来1.有人可以解释这种奇怪行为的原因吗?

Hum*_*awi 62

你正在初始化i自己.两者i的在 int i = i;是内一个不外一个.这是未定义的行为,您可能会得到0或可能发生任何事情.

如果要将外部分配给i内部,这是正确的方法i.

#include <iostream>

int i = 1;
int main()
{
    int i = ::i;
    std::cout << "i: " << i << "\n";
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

现场演示


顺便说一句,你应该仔细阅读所有编译器警告.如果你这样做,你可以自己看到问题:

警告'i'在此函数中未初始化使用

  • 稍微挑剔:"你可能得到0或int范围内的任何其他随机值"不是100%正确.它是UB,因此任何事情都会发生.如果他触发了一个时间门户,并且这将为您带来100年的未来,那么这仍然是该计划的有效行为.并不是说我知道一个编译器这样做(......这可能是由于实现这个的人在将来测试时消失了,然后才能分享他们的工作) (13认同)
  • 你是否有任何支持int i = i声明的标准片段; 实际上是未定义的行为.未初始化的变量不是未定义的行为,它只是具有未指定的值.由于这个确切的结构出现在标准(3.3.2)中,声称该值将是不确定的,我高度怀疑这是UB. (5认同)
  • @SteveCox:请参阅http://stackoverflow.com/q/23415661/103167 (2认同)

归档时间:

查看次数:

1558 次

最近记录:

9 年,9 月 前