我只是想用C或C ++来表达:
b == c || b == d
我可以这样做:
b == (c || d)
并获得相同的行为?
答案 0 :(得分:5)
第一个表达
如果b == c || b == d
等于b
或c
,d
会给您真实的。
第二个表达
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
运算符的值为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
false
或true
(在C ++中)或0
或1
(在C中)x < y
的结果与{的值进行比较{1}}。