C语言关于&与&&运算符

C语言关于&与&&运算符

我们知道,在很多场景中&和&&通常可以相互代替,那么它们到底有什么不同呢?

先看一段代码

cpp 复制代码
bool a, b, c;
c = a & b;

使用clang++ -S编译出来的指令如下:

asm 复制代码
	movb	-5(%rbp), %al       # a
	andb	$1, %al
	movzbl	%al, %eax
	movb	-6(%rbp), %cl       # b
	andb	$1, %cl
	movzbl	%cl, %ecx
	andl	%ecx, %eax          # a & b
	cmpl	$0, %eax
	setne	%al
	andb	$1, %al 
	movb	%al, -7(%rbp)       # c

使用clang++ -S -O3编译出来的指令如下:

asm 复制代码
	movzbl	-1(%rbp), %edx
	andb	-2(%rbp), %dl

再看一段代码:

cpp 复制代码
bool a, b, c;
c = a && b;

其汇编代码为:

asm 复制代码
    xorl	%eax, %eax
	testb	$1, -5(%rbp)        # a
	movb	%al, -8(%rbp)                   
	je	.LBB2_2
# %bb.1:
	movb	-6(%rbp), %al       # b
	movb	%al, -8(%rbp)                   
.LBB2_2:
	movb	-8(%rbp), %al                   
	andb	$1, %al
	movb	%al, -7(%rbp)       # c

反汇编一下:

cpp 复制代码
tmp = a;
if(a==1) {
    tmp = b;
}
c = tmp & 1;

通过对比两段汇编代码就很清晰了,&运算在底层表现为一条指令and,而&&运算实际上需要通过分支的方式实现。

那么能否说明&的效率比&&要高呢?不一定

我们知道,&是与运算,例如要得到a & b的值,就必须分别求得a和b的值。但是&&通过分支的方式实现,要想得到a && b的值,其实不必都求出a和b的值,如果先求出a的值是0,那么就不必再求b了。

再看一段代码:

cpp 复制代码
bool funcA() {
    
}

bool funcB() {
    
}

int main () {
    bool c = funcA() & funcB();
    bool d = funcA() && funcB();
}

上述代码中表达式funcA() & funcB() 与 funcA() && funcB() 哪一个效率更高?

需要具体分析funcA()和funcB()的返回值分布与复杂度,如果funcA()和funcB()复杂度很低,并且大部分情况下返回1,那么funcA() & funcB()的效率可能会高些;如果funcA()和funcB()复杂度较高,并且有可能返回0,那么funcA() && funcB()会高一些。

另外值得一提的是,funcA() && funcB()与funcB() && funcA()哪个效率高?

返回0概率 复杂性(耗时)
funcA() a_pz a_cost
funcB() b_pz b_cost

funcA() && funcB() 期望耗时为:

a_cost + (1-a_pz) * b_cost

funcB() && funcA() 期望耗时为:

b_cost + (1-b_pz) * a_cost

举个例子

返回0概率 复杂性(耗时)
funcA() 0.9 50
funcB() 0.8 40

funcA() && funcB() 期望耗时为54; funcB() && funcA() 期望耗时为50

相关推荐
祈安_3 天前
C语言内存函数
c语言·后端
郑州光合科技余经理5 天前
代码展示:PHP搭建海外版外卖系统源码解析
java·开发语言·前端·后端·系统架构·uni-app·php
feifeigo1235 天前
matlab画图工具
开发语言·matlab
dustcell.5 天前
haproxy七层代理
java·开发语言·前端
norlan_jame5 天前
C-PHY与D-PHY差异
c语言·开发语言
多恩Stone5 天前
【C++入门扫盲1】C++ 与 Python:类型、编译器/解释器与 CPU 的关系
开发语言·c++·人工智能·python·算法·3d·aigc
QQ4022054965 天前
Python+django+vue3预制菜半成品配菜平台
开发语言·python·django
czy87874755 天前
除了结构体之外,C语言中还有哪些其他方式可以模拟C++的面向对象编程特性
c语言
遥遥江上月5 天前
Node.js + Stagehand + Python 部署
开发语言·python·node.js
m0_531237175 天前
C语言-数组练习进阶
c语言·开发语言·算法