一些编译器是否有趣 - 业务还在继续?

时间:2014-05-01 00:27:35

标签: c++ visual-studio compiler-construction

我只测试了两个简单的表达式,尽管相反的值会产生相同的结果。

int main() {
    unsigned int a = 50, b = 33, c = 24, d = 12;

    if (a != b < c){
        /*a is not equal to b, so the bool is converted to 1 and 1 is less than c*/
        cout << "This is apparent" << endl;
    }

    if (a != b > c){
        /* a is not equal to b, so the bool is converted to one and 1 is not more than c.
         * The expression still evaluates to true.
         * Why is this? Is the compiler messing with something? */

        cout << "This is apparent" << endl;
    }

    return 0;
}

1 个答案:

答案 0 :(得分:11)

唯一有趣的业务&#34;是编译器正在做它应该做的事情。

<>和其他关系运算符的绑定比=!=更紧密,因此:

if (a != b < c)

相当于:

if (a != (b < c))

由于a既不是0也不是1,因此它不等于任何相等或关系运算符的结果。

要比较!=c的结果,您可以写:

if ((a != b) < c)

如果您不确定您正在使用的运营商的相对优先级,或者您的读者可能不确定,则应使用括号。我非常了解C,但我必须检查标准,以确保关系运算符和相等运算符的相对优先级。

但在这种特殊情况下,我无法想出任何理由去做你最初做的事情(除了作为理解表达评价的练习外,如果这样做是完全合理的话#&# 39;你正在做什么)。如果我在真实世界的代码中看到if ((a != b) < c),我可能会要求作者重写它。