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

4

我很想知道在C或C++中,对于这个表达式:

b == c || b == d

我可以做这样的事情吗:

我可以像这样做吗:

b == (c || d)

并获得相同的行为?

2个回答

5

第一个表达式b == c || b == d,如果b等于cd,则返回true。

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

现在你可以清楚地看到这两个表达式是不同的。

对于第二种情况,如果c和d都为0,则b必须为0才能为真;否则,b必须为1才能为真。 - user2897690
1
严格来说,(c || d)boolean 类型,在 b == (c || d) 比较中,它被提升为 int 类型并变成了 1 - jogojapan
一个令人信服的第三个演示是将 b = 1 - Jonathan Leffler
@jogojapan:在C语言中,(c || d)的类型是int,值为01。C语言确实有一个内置的布尔类型叫做_Bool,在1999年标准中添加,但它并不用于产生逻辑布尔值的任何内置运算符;它们都产生int类型的值。而在C++中,结果的类型是bool。(我看到问题现在同时被标记为C和C++。) - Keith Thompson
@KeithThompson:该问题在提问时被双重标记; 最初的内容询问关于C语言,所以我简要删除了C++标记,但由于最佳答案是用C++回答且与标记匹配,所以最终我将C++添加到问题文本中(并恢复了标记)——大约5分钟后。 C和C++中的答案几乎相同——差异在于bool vs int部分,但数值最终相同。 - Jonathan Leffler
显示剩余3条评论

2
不,C和C ++中的运算符不会像数学或英语中那样自动分配子表达式。评估严格定义为运算符与操作数的直接关联。没有“快捷方式”。
如果你编写错误地假设这种隐含分配的代码,你可能最终得到一个在语法和语义上都有效但并不如你所期望的表达式。
“||”运算符如果其中一个操作数为真(非零),它就会产生值“1”或“true”,否则如果两个操作数都为false(等于零),它就会产生值“0”或“false”。操作数不必是布尔类型,可以是任何标量类型。(在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

比较 x < y 的结果是 false 或者 true(在 C++ 中),或者是 0 或者 1(在 C 中),然后再将其与 z 的值进行比较。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接