在 C++ 中,&&
(逻辑)和 &
(按位)在 bool(s) 之间有什么区别吗?
bool val1 = foo();
bool val2 = bar();
bool case1 = val1 & val2;
bool case2 = val1 && val2;
case1
和 case2
是否相同,或者如果不同,它们究竟有何不同,为什么要选择一个而不是另一个?按位和 boolean 值可移植吗?
最佳答案
standard保证 false
转换为 0 并且 true
转换为 1 作为整数:
4.7 Integral conversions
...
If the destination type is bool, see 4.12. If the source type is bool, the value false is converted to zero and the value true is converted to one.
所以你给出的例子中的效果保证是一样的,是100%可移植的。
对于您给出的情况,任何体面的编译器都可能生成相同的(最佳)代码。
但是,对于 boolean 表达式 expr1
和 expr2
,一般情况下 expr1 && expr2
与 相同是不正确的expr1 & expr2
因为 &&
执行“短路”评估。也就是说,如果 expr1
的计算结果为 false
,则 expr2
甚至不会被计算。这会影响性能(如果 expr2
很复杂)和行为(如果 expr2
有副作用)。 (但请注意,如果 &
形式避免了条件分支,它实际上可以更快......出于性能原因玩弄这种东西几乎总是一个坏主意。)
因此,对于您给出的具体示例,您将值加载到局部变量中然后对其进行操作,行为是相同的,性能很可能是。
在我看来,除非您特别依赖“短路”行为,否则您应该选择最清楚表达您的意图的表述。因此,使用 &&
进行逻辑与,使用 &
进行位旋转 AND,任何有经验的 C++ 程序员都会发现您的代码很容易理解。
关于c++ - && 和 & 与 bool(s) 之间有什么区别吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6577504/