【问题标题】:Why is the value of i == 0 in this C++ code? [duplicate]为什么这个 C++ 代码中 i == 0 的值? [复制]
【发布时间】:2016-07-07 00:00:18
【问题描述】:

我对以下代码感到困惑:

#include <iostream>

int i = 1;
int main()
{
    int i = i;
    std::cout << "i: " << i << "\n";
    return 0;
}

输出:

i: 0

我原以为运行上面的代码会打印出1。有人可以解释一下这种奇怪行为的原因吗?

【问题讨论】:

  • 发生奇怪的事情时,通常是UB。
  • 警告 "main.cpp:13:13: Variable 'i' is uninitialized when used in its own initialization: 由合理的编译器给出可能是对问题的提示。也许会堵塞你的警告级别并听取他们的建议。
  • 当您分配 int i= i; 时,i 会使用您刚刚声明的 i 的值进行初始化,因此是未定义的值。
  • 请始终使用-Wall -Werror进行编译
  • 旁白:以防你不熟悉undefined behavior

标签: c++ undefined-behavior


【解决方案1】:

你正在用自己初始化iint i = i; 中的两个 i 都是内部的,而不是外部的。这是未定义的行为,您可能会收到0任何事情都可能发生。

如果您想将外部i 分配给内部i,这是正确的方法。

#include <iostream>

int i = 1;
int main()
{
    int i = ::i;
    std::cout << "i: " << i << "\n";
    return 0;
}

Live Demo


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

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

【讨论】:

  • 挑剔一点:“你可能会得到 0 或 int 范围内的任何其他随机值”不是 100% 正确的。它是UB,因此任何事情都会发生。如果他触发了一个时间门户,这将你拉到未来 100 年,这仍然是该程序的有效行为。并不是说我知道有一个编译器这样做(......这可能是由于实现这个的人在未来测试时消失了,在他们可以分享他们的工作之前)
  • @johannes 这是一个全新的水平...编辑感谢!
  • 您是否有任何标准的 sn-ps 支持 int i = i; 的声明?实际上是未定义的行为。未初始化的变量不是未定义的行为,它只是具有未指定的值。而且由于这个确切的结构出现在标准(3.3.2)中,并声称该值是不确定的,我高度怀疑这是 UB。
  • @SteveCox 我不认为这是未定义的行为,因为没有执行算术运算。在除法运算中使用i 作为分母可能根据各种因素导致未定义的行为。
猜你喜欢
  • 1970-01-01
  • 2015-06-30
  • 1970-01-01
  • 2013-06-04
  • 1970-01-01
  • 1970-01-01
  • 2012-11-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多