2

为什么未初始化的“max”和“min”值在 Linux 上有效,而在 Windows 上无效?例如:

double max, min, test;
while (1)
{
  std::cin >> test;
  if (test > max)
    max = test;

  if (test < min)
    min = test;
}

这适用于 Linux。我知道一个事实,因为我已经使用它(尽管直到现在我才意识到这是多么可怕)至少 3 个月了。但是,许多同事告诉我,这在他们的机器上被破坏了:他们使用 Visual Studio 编译。他们的陈述是否有道理,为什么?这仅仅是UB的情况吗?如果是这样,在我没有注意到的情况下,过去几个月它是如何工作的?

另请注意:gcc (Ubuntu/Linaro 4.5.2-8ubuntu4) 4.5.2 和 Visual Studio 2010

4

4 回答 4

8

这在任何平台上都“有效”。

它所做的只是调用Undefined Behavior“似乎做到了我的预期”只是UB实现自身的一种方式。然而,这是一个相当不幸的问题,因为它让你相信你的代码是好的,直到有一天它突然出现在你客户的脸上。

于 2012-06-08T14:28:50.520 回答
6

因为未定义的行为是未定义的。它可能有效,也可能无效,你只是不知道。显然,在您的 linux 环境中,它可以工作。

于 2012-06-08T14:27:20.950 回答
3

粗略地说,如果未初始化的变量min恰好max包含在test. 未初始化的自动变量的对象表示可能一致,也可能不一致,这取决于编译器、选项和程序其余部分中的代码。读取一个未初始化的值肯定是 UB。UB 可能一致,也可能不一致。

因此,例如,您可以获得观察到的行为的一种简单方法是:

  • 您的测试集都包含正值和负值,
  • gcc/linux 始终在未初始化的变量中放置一个全位为零的表示,
  • VS 始终将 NaN 放入未初始化的变量中(因此test < mintest > max都始终为假)。

根据您的测试数据是什么,以及“在他们的机器上损坏”的含义,细节可能会有所不同。我刚刚描述了 UB 无限范围之外的一种可能性。

于 2012-06-08T14:48:45.653 回答
3

使用未初始化变量的值是未定义的行为,因此任何事情都可能发生。任何东西,这意味着代码可能看起来可以工作,它可能会崩溃,或者它可能会导致恶魔飞出你的鼻子。

于 2012-06-08T14:27:34.293 回答