C++中&&、and、bitand与||、or、bitor的区别及性能差异问询
嘿,让我来帮你把这几个C里的操作符区别和性能问题讲明白,这也是不少刚接触C替代关键字的开发者会疑惑的点~
一、C++中"and"、"&&"和"bitand"的区别
这三个可以分成两组来看:
&&和and:这俩是完全等价的亲兄弟!and是C++标准规定的替代关键字,功能和逻辑与操作符&&一模一样——专门用来做布尔逻辑判断,而且会触发短路求值:如果左边的表达式已经算出是false,右边的表达式就直接跳过不执行了。比如写if (ptr && ptr->get_value()),要是ptr是空指针,右边的成员访问就不会触发,完美避免了空指针错误。至于为啥要有
and这种写法?主要是为了让代码在某些特殊字符受限的环境下能正常编译,或者让代码读起来更贴近自然语言,比如有些开发者觉得if (is_valid and has_permission)比if (is_valid && has_permission)更直观。bitand:这个和上面俩就不是一个赛道的了,它是按位与操作符&的替代关键字,作用是对两个整数的二进制位逐位进行与运算。举个例子:3 bitand 5(也就是3 & 5),二进制是011 & 101 = 001,结果就是1。它不存在短路求值这回事,不管左边的结果是什么,右边的表达式都会被完整执行,因为它是直接操作二进制位的运算,和逻辑判断完全无关。
二、AND/OR系列操作符的性能差异
这里得分两种情况来聊:
- 替代关键字和原符号的性能对比:完全没差异!不管是
and和&&、or和||,还是bitand和&、bitor和|,编译器在编译阶段都会把它们转换成完全相同的机器码——它们只是语法层面的不同写法,本质上是同一个东西,所以性能上没有任何区别,选哪种纯粹是个人编码风格或者项目规范的要求。 - 逻辑操作与按位操作的性能对比:这俩因为语义不同,可能会出现性能差异:
- 逻辑操作(
&&/and、||/or)的短路求值特性,在很多场景下会让它更快:比如逻辑与时,左边表达式如果能快速得到false,右边的高成本计算就直接跳过了;逻辑或时,左边如果是true,右边也不用跑了,这能省不少计算时间。 - 按位操作(
bitand/&、bitor/|)是CPU原生的快速指令,但它必须执行完左右两边的表达式,所以如果右边的表达式计算成本很高,那按位操作就可能比能短路的逻辑操作慢。 - 另外,逻辑操作会把操作数转换成布尔值,按位操作直接处理整数类型,这中间的类型转换可能带来极其微小的开销,但除非是极端性能敏感的场景(比如高频循环里的核心计算),否则基本可以忽略不计。
- 逻辑操作(
内容的提问来源于stack exchange,提问作者Mircea
相关产品推荐
相关产品推荐

