为什么 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)则不会。现在很多编译器优化都围绕着不转储管道。

像这样,检查生成的程序集。

使用不太积极优化的编译器,您可能会以无输出的无限循环结束。