4
A
回答
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
现在你可以清楚地看到,两个表达式都不尽相同。
2
不,C和C++中的运算符不会像这样隐式地分布在子表达式上。评估严格定义为操作符与操作数的直接关联。在数学或英语中可能没有“捷径”。
如果您编写的代码错误地假定了这种隐式分布,那么您最终可能会得到一个语法上和语义上有效的表达式,但这并不符合您的期望。
的||
操作者产生的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
的结果与z
的值进行比较。
相关问题
- 1. C#与||进行逻辑比较或&&
- 2. 比较的char []的平等使用C
- 3. C++ :: toupper不允许平等比较吗?
- 4. Hack如何与C++进行比较?
- 5. 如何字典比较平等的列表,在C#
- 6. 比较平等
- 7. 如何将BSTR与c/C++中的字符串进行比较?
- 8. 在C中的两个对象的平等比较#
- 9. 如何在C#实体函数中进行DateTime比较?
- 10. 如何在Windows中与C进行比较
- 11. 如何在c中将对象与null进行比较#
- 12. 如何在C或C++中比较日/月/年?
- 13. 在gtest(C++)和nunit(C#)中进行双重比较的区别
- 14. 如何比较C#
- 15. 如何比较在C#
- 16. 如何比较HH:MM在C#
- 17. 比较float2s的平等/不平等
- 18. 如何在C LPWSTR上进行字符串比较?
- 19. 使用NSArray进行C型int比较
- 20. c char字符数组进行比较
- 21. 将XML与TXT进行比较C#
- 22. 将crc32与cksum进行比较c
- 23. 如何在MySQL WHERE子句中进行等式比较?
- 24. 如何比较C或C++数组中的内容
- 25. 如果在SSH命令中进行比较,使用sh -c
- 26. 在地图比较中使用平等
- 27. 比较在C#
- 28. 如何在git中进行此比较?
- 29. curdate()如何在MySQL中进行比较
- 30. 如何在linq c中比较日期#
'b'不一定是'1'才能成为'true'。 – jogojapan
对于第二种情况,如果c和d都为0,则b必须为0才能成立;否则b必须是一个才能成立true – 2014-02-16 02:12:26
严格地说,'(c || d)'是* boolean *,在'b ==(c || d)'比较中,它被提升为'int '变成'1'。 – jogojapan