变量x等于a或b

时间:2013-02-24 14:34:03

标签: c++ lazy-evaluation

这是:

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,所以我想确定。

6 个答案:

答案 0 :(得分:3)

即可。

在C ++中,这个:

x == a || b  // Same as (x == a) || b

等同于:

(x == a) || (bool)b

如果truex相等,或a在转换为b时评估为true,则评估为bool。另一方面,在C中,它等同于:

(x == a) || (b != 0)

如果truex相等,或者如果a与0不同,那么评估为b(这里我们必须隐含假设b是整数类型,否则不会编译)。

另一方面,这个:

(x == a || x == b) // Same as ((x == a) || (x == b))

truex相等或ax相等时评估为b(即xa在C ++和C中都等于b或等于{{1}}。

答案 1 :(得分:2)

这两个表达式并不相同。此

if(x == a || b)

相当于

if( (x == a) || (b))

x==ab的OR。在C ++中,如果b评估为0false以外的任何内容,则会将其视为true

第二个测试是x==b而不是简单地测试b

答案 2 :(得分:1)

没有。在C中,这相当于:

if(x == a || b != 0)

答案 3 :(得分:0)

第一个读作“如果x等于a,或者b是真的”

第二个读作“如果x等于a,或者如果x等于b”

答案 4 :(得分:0)

if (x == a || b)

等于

if ((x == a) || (bool)b)

因为运算符==优先级高于运算符||。请参阅Operator Precedence Table

答案 5 :(得分:0)

你几乎是对的,第一种情况意味着 x等于OR b是真的

延迟评估意味着只会在结果明显之前评估表达式。在OR表达式中,例如(x || y),结果将在x==true时知道 - 然后整个表达式也必须为真。对于AND,例如(x && y),结果将在x==false时显现。所以你是对的,如果x==a,我们已经知道了答案,不需要再做任何工作了。