【发布时间】:2013-03-21 14:57:20
【问题描述】:
以下代码中的逻辑运算符和位运算符在功能上有什么区别吗?使用一种或另一种的原因是什么?
typedef unsigned char BOOLEAN;
void orOperatorsComparison(BOOLEAN bBar, BOOLEAN bFoo)
{
BOOLEAN bLogicalOr = (bFoo || bBar);
BOOLEAN bBitwiseOr = (bFoo | bBar);
...
}
【问题讨论】:
-
如果
bBar为真,则变量bFoo甚至都不会被访问...... -
短路是否只发生在逻辑运算符上?
-
谢谢大家,我没有想到短路,但这正是我正在寻找的答案。
-
特别是,如果
bBar是一些指针取消引用或一些数组访问,它会产生很大的不同:当bFoo为真且bBar无效时,编码bFoo|bBar[20]可能会崩溃指针(例如为空,或数组太小)。但是编码bFoo||bBar[20]可以避免崩溃。 -
@ulidtko 这是一个 C 问题,不应出现在 C++ 常见问题解答中。 C++ 有一个真正的
bool类型,C++ 中的逻辑||表达式产生一个bool类型的结果。在 C 中,由于隐式类型提升,它们产生类型int。我相信|运算符在两种语言中都会产生一个 int 。
标签: c