-5

这是:

if(x == a || b){//do something}

如同:

if(x == a || x == b){//do something}

?

我认为不是,因为在第一种情况下,我们评估 x 是否等于 a 以及 b 是真还是假。

在第二种情况下,我们评估 x 是否等于 a 以及 x 是否等于 b。而且我明白,在惰性评估中,如果 x 等于 a,我们就不会进一步评估。

但有人认为,在第一种情况下,我们会问 x 是等于 a 还是 b,所以我想确定一下。

4

6 回答 6

3

没有

在 C++ 中,这是:

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

相当于这个:

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

其计算结果为trueifxa等于 OR ifb计算结果为true时转换为bool. 另一方面,在 C 中,它等价于:

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

哪个评估为trueifx并且a等于 OR ifb与 0 不同(这里我们必须做出整数类型的隐式假设b,否则将无法编译)。

另一方面,这是:

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

在 C++ 和 C 中计算两者中的true一个xa相等或xb相等(即,如果x等于a或等于)。b

于 2013-02-24T14:36:44.733 回答
2

这两个表达式不等价。这个

if(x == a || b)

相当于

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

即 和 的x==ab。在 C++ 中,如果计算结果为orb以外的任何值,则将其视为.0falsetrue

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

于 2013-02-24T14:35:37.853 回答
1

不。在 C 中,这相当于:

if(x == a || b != 0)
于 2013-02-24T14:35:46.793 回答
0

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

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

于 2013-02-24T14:36:17.853 回答
0

不。

if (x == a || b)

等于

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

因为 operator==优先级高于 operator ||。请参阅运算符优先级表

于 2013-02-24T14:43:27.230 回答
0

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

惰性求值意味着仅在结果明显之前对表达式进行求值。例如(x || y),在 OR 表达式中,结果将是已知x==true的 - 那么整个表达式也必须为真。在 AND 的情况下,如(x && y),结果将在 时显而易见x==false。所以你是对的,如果x==a,我们已经知道答案并且不需要更多的工作。

于 2013-02-24T14:45:59.740 回答