我只测试了两个简单的表达式,尽管相反的值会产生相同的结果。
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;
}
答案 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)
,我可能会要求作者重写它。