2014-02-16 23 views

回答

5

第一个表达式 b == c || b == d会给你如果属实b等于或者cd

第二个表达式 b == (c || d)将仅检查b等于0还是1,因为c || d的输出是二进制的。

考虑以下代码:

#include <iostream> 
using namespace std; 

int main() { 
    int b=10,c=9,d=10; 
    cout << (b ==c || b ==d)<<endl; 
    cout<< (b == (c || d)) <<endl; 
    d=11; 
    cout << (b ==c || b ==d)<<endl; 
    cout<< (b == (c || d)) <<endl; 
    return 0; 
} 

输出是

1 
0 
0 
0 

现在你可以清楚地看到,两个表达式都不尽相同。

+0

'b'不一定是'1'才能成为'true'。 – jogojapan

+0

对于第二种情况,如果c和d都为0,则b必须为0才能成立;否则b必须是一个才能成立true – 2014-02-16 02:12:26

+1

严格地说,'(c || d)'是* boolean *,在'b ==(c || d)'比较中,它被提升为'int '变成'1'。 – jogojapan

2

不,C和C++中的运算符不会像这样隐式地分布在子表达式上。评估严格定义为操作符与操作数的直接关联。在数学或英语中可能没有“捷径”。

如果您编写的代码错误地假定了这种隐式分布,那么您最终可能会得到一个语法上和语义上有效的表达式,但这并不符合您的期望。

||操作者产生的1true一个值,如果任一操作数为真(非零),或者如果两个操作数都假(等于零)的0false值。操作数不必是布尔值;它们可以是任何标量类型。 (在C的结果为int类型;在C++中它是bool类型。),以

(b == c) || (b == d) 

表达

b == c || b == d 

是等效和产生一个真正的结果,如果b等于c如果b等于d。但此表达式:

b == (c || d) 

计算的(c || d)值,并且测试是否b等于子表达式的结果。

混乱的类似可能的来源是

x < y < z 

不等同于

(x < y) && (y < z) 

相反,它相当于

(x < y) < z 

其中falsetrue(在C++中)或01(在C中)x < y的结果与z的值进行比较。