为什么未初始化的“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
答案 0 :(得分:8)
这“无效”。
所有这一切都是调用未定义的行为。 “似乎做我所期望的”只是 UB 实现自身的一种方式。不过,这是一个相当不幸的事情,因为它让你相信你的代码很好,直到有一天它会爆炸到你客户的脸上。
答案 1 :(得分:6)
因为未定义的未定义行为。它可能有用,或者它可能不起作用,你只是不知道。显然,在您的Linux环境中,它可以工作。
答案 2 :(得分:3)
使用未初始化变量的值是未定义的行为,因此任何事情都可能发生。 任何,这意味着代码似乎可以正常工作,它可能会崩溃,或者它可能会让恶魔飞出你的鼻子。
答案 3 :(得分:3)
粗略地说,如果未初始化的变量min
和max
碰巧保留了test
中遇到的实际最小值和最大值之间的值,那么您的代码似乎会有用。 。未初始化的自动变量的对象表示可能是也可能不一致,具体取决于编译器,选项和程序其余部分中的代码。读取未初始化的值肯定是UB。 UB可能是也可能不一致。
例如,您可以通过以下方式获得您观察到的行为的一种简单方法:
test < min
和test > max
都是假的。)根据您的测试数据以及“在其机器上损坏”的含义,细节可能会有所不同。我刚刚在UB的无限范围内描述了一种可能性。