c++ - && 和 & 与 bool(s) 之间有什么区别吗?

标签 c++ bitwise-operators boolean logical-operators language-lawyer

在 C++ 中,&&(逻辑)和 &(按位)在 bool(s) 之间有什么区别吗?

bool val1 = foo();
bool val2 = bar();

bool case1 = val1 & val2;
bool case2 = val1 && val2;

case1case2 是否相同,或者如果不同,它们究竟有何不同,为什么要选择一个而不是另一个?按位和 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 表达式 expr1expr2,一般情况下 expr1 && expr2 相同是不正确的expr1 & expr2 因为 && 执行“短路”评估。也就是说,如果 expr1 的计算结果为 false,则 expr2 甚至不会被计算。这会影响性能(如果 expr2 很复杂)和行为(如果 expr2 有副作用)。 (但请注意,如果 & 形式避免了条件分支,它实际上可以更快......出于性能原因玩弄这种东西几乎总是一个坏主意。)

因此,对于您给出的具体示例,您将值加载到局部变量中然后对其进行操作,行为是相同的,性能很可能是。

在我看来,除非您特别依赖“短路”行为,否则您应该选择最清楚表达您的意图的表述。因此,使用 && 进行逻辑与,使用 & 进行位旋转 AND,任何有经验的 C++ 程序员都会发现您的代码很容易理解。

关于c++ - && 和 & 与 bool(s) 之间有什么区别吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6577504/

相关文章:

c++ - 如何在不调用非常量方法的情况下更改私有(private)成员?

c++ - 如何将 GSL 与 C++11 和新的 STL 一起使用?

python - 为什么 "No"在以下 python 代码中作为 raw_input 返回 TRUE?

swift - 等待 boolean 值成为 'true' 的更优雅的方式

javascript - 使用 boolean 类型与字符串类型 "true"/"false"的优缺点是什么?

c++ - 复制构造动态分配对象的问题

c++ - QSound播放.wav文件时出现意外的null接收器

assembly - 如何为 Risc-V(汇编语言)编写 NOT 操作?

将 uint16_t 转换为字节,反之亦然 - 与系统字节顺序无关

javascript - 在这行 javascript 中波浪号在做什么?