为什么 2 不 > 0 ?它是 <= 0,但不是 < 0,也不 == 0
Why is 2 not > 0 ?? It is instead <= 0, but not < 0, nor == 0
当我遇到一个对我来说完全没有意义的问题时,我正在弄乱 C++。出于某种原因,变量等于 2、2 > 0 returns 为假,但 2 <= 0 和 2 >= 0 return 为真,同时 2 < 0 和 2 == 0 return假的。但是,如果我只使用静态 2,一切都会按预期工作。
完整代码如下:
#include <iostream>
using namespace std;
long long f (long long n)
{
while (n > 0);
{
n /= 10;
}
cout << n << ": " << endl;
cout << n << " > 0 = " << (n > 0) << endl;
cout << n << " < 0 = " << (n < 0) << endl;
cout << n << " >= 0 = " << (n >= 0) << endl;
cout << n << " <= 0 = " << (n <= 0) << endl;
cout << 2 << ": " << endl;
cout << 2 << " > 0 = " << (2 > 0) << endl;
cout << 2 << " < 0 = " << (2 < 0) << endl;
cout << 2 << " >= 0 = " << (2 >= 0) << endl;
cout << 2 << " <= 0 = " << (2 <= 0) << endl;
return 0;
}
int main()
{
long long n = 27;
f(n);
}
这个returns:
2:
2 > 0 = 0
2 < 0 = 0
2 >= 0 = 1
2 <= 0 = 1
2:
2 > 0 = 1
2 < 0 = 0
2 >= 0 = 1
2 <= 0 = 0
愚蠢的错误,在 while(n > 0) 之后留下了分号,似乎导致了一些奇怪的副作用。
编译器在评估条件时假定 n
为零。
允许这样做,因为 while (n > 0);
未定义正数 n
,并且允许编译器假设没有未定义的行为。
这是合理的,因为条件语句可能导致分支预测失败,而输出 n
(整数除以 10 后为 2)则不会。现在很多编译器优化都围绕着不转储管道。
像这样,检查生成的程序集。
使用不太积极优化的编译器,您可能会以无输出的无限循环结束。
当我遇到一个对我来说完全没有意义的问题时,我正在弄乱 C++。出于某种原因,变量等于 2、2 > 0 returns 为假,但 2 <= 0 和 2 >= 0 return 为真,同时 2 < 0 和 2 == 0 return假的。但是,如果我只使用静态 2,一切都会按预期工作。
完整代码如下:
#include <iostream>
using namespace std;
long long f (long long n)
{
while (n > 0);
{
n /= 10;
}
cout << n << ": " << endl;
cout << n << " > 0 = " << (n > 0) << endl;
cout << n << " < 0 = " << (n < 0) << endl;
cout << n << " >= 0 = " << (n >= 0) << endl;
cout << n << " <= 0 = " << (n <= 0) << endl;
cout << 2 << ": " << endl;
cout << 2 << " > 0 = " << (2 > 0) << endl;
cout << 2 << " < 0 = " << (2 < 0) << endl;
cout << 2 << " >= 0 = " << (2 >= 0) << endl;
cout << 2 << " <= 0 = " << (2 <= 0) << endl;
return 0;
}
int main()
{
long long n = 27;
f(n);
}
这个returns:
2:
2 > 0 = 0
2 < 0 = 0
2 >= 0 = 1
2 <= 0 = 1
2:
2 > 0 = 1
2 < 0 = 0
2 >= 0 = 1
2 <= 0 = 0
愚蠢的错误,在 while(n > 0) 之后留下了分号,似乎导致了一些奇怪的副作用。
编译器在评估条件时假定 n
为零。
允许这样做,因为 while (n > 0);
未定义正数 n
,并且允许编译器假设没有未定义的行为。
这是合理的,因为条件语句可能导致分支预测失败,而输出 n
(整数除以 10 后为 2)则不会。现在很多编译器优化都围绕着不转储管道。
像这样,检查生成的程序集。
使用不太积极优化的编译器,您可能会以无输出的无限循环结束。