这是:
if(x == a || b){//do something}
同样如下:
if(x == a || x == b){//do something}
我认为不是,因为在第一种情况下,我们评估x是否等于a以及b是真还是假。
在第二种情况下,我们评估x是否等于a而x是否等于b。我理解,在lazy evaluation中,如果x等于a,则我们不会进一步评估。
但是有人认为在第一种情况下我们会问x是否等于a或b,所以我想确定。
答案 0 :(得分:3)
否即可。
在C ++中,这个:
x == a || b // Same as (x == a) || b
等同于:
(x == a) || (bool)b
如果true
和x
相等,或a
在转换为b
时评估为true
,则评估为bool
。另一方面,在C中,它等同于:
(x == a) || (b != 0)
如果true
和x
相等,或者如果a
与0不同,那么评估为b
(这里我们必须隐含假设b
是整数类型,否则不会编译)。
另一方面,这个:
(x == a || x == b) // Same as ((x == a) || (x == b))
当true
和x
相等或a
和x
相等时评估为b
(即x
是a
在C ++和C中都等于b
或等于{{1}}。
答案 1 :(得分:2)
这两个表达式并不相同。此
if(x == a || b)
相当于
if( (x == a) || (b))
即x==a
和b
的OR。在C ++中,如果b
评估为0
或false
以外的任何内容,则会将其视为true
。
第二个测试是x==b
而不是简单地测试b
。
答案 2 :(得分:1)
没有。在C中,这相当于:
if(x == a || b != 0)
答案 3 :(得分:0)
第一个读作“如果x等于a,或者b是真的”
第二个读作“如果x等于a,或者如果x等于b”
答案 4 :(得分:0)
答案 5 :(得分:0)
你几乎是对的,第一种情况意味着 x等于OR b是真的。
延迟评估意味着只会在结果明显之前评估表达式。在OR表达式中,例如(x || y)
,结果将在x==true
时知道 - 然后整个表达式也必须为真。对于AND,例如(x && y)
,结果将在x==false
时显现。所以你是对的,如果x==a
,我们已经知道了答案,不需要再做任何工作了。