未初始化的值在Linux上的行为与预期不同,但不是Windows

Dri*_*ise 2 c++ g++ visual-studio-2010

为什么未初始化的"max"和"min"值适用于Linux而不适用于Windows?例如:

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

  if (test < min)
    min = test;
}
Run Code Online (Sandbox Code Playgroud)

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

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

sbi*_*sbi 8

这在没有平台上"有效".

它只是调用未定义的行为."似乎做我所期望的"只是UB实现自身的一种方式.不过,这是一个相当不幸的事情,因为它让你相信你的代码很好,直到有一天它会爆炸到你客户的脸上.


mfo*_*ini 6

因为未定义的行为未定义.它可能有用,或者它可能不起作用,你只是不知道.显然,在您的Linux环境中,它可以工作.

  • @Drise:你需要明白"未定义"的确不是"你会得到一个错误"或"它取决于细节"或其他任何东西.它*字面意思*意味着它是**未定义**(它可以导致**任何**或*没有*)......期间.在我之后重复:未定义的行为确实*********暗示我会收到错误; 未定义的行为确实******暗示我会收到错误... (6认同)
  • 是.未定义并不意味着它不一致.它可能是也可能不是.这正是我期望未定义但一致的事情. (2认同)