如何在C或C ++中进行平等比较?

时间:2014-02-16 02:04:49

标签: c++ c

我只是想用C或C ++来表达:

b == c || b == d

我可以这样做:

b == (c || d)

并获得相同的行为?

2 个答案:

答案 0 :(得分:5)

第一个表达 如果b == c || b == d等于bcd会给您真实的。

第二个表达 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

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

答案 1 :(得分:2)

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

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

如果任一操作数为true(非零)或值为||1,则true运算符的值为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的结果与{的值进行比较{1}}。