当前位置:首页 > 开发 > 编程语言 > 编程 > 正文

C语言逻辑与、逻辑或的编译

发表于: 2011-10-25   作者:deltamaster   来源:转载   浏览次数:
摘要: int main() { int a, b; int c = a && b; int d = a || b; return 0; }     这样的一段非常简单的程序,编译器一般会如何实现它呢?     首先,x86架构的CPU没有逻辑与和逻辑或的指令,那么,对于逻辑与和逻辑或,编译器会如何将其转换为x86指令集下的指令序列呢

int main() {
	int a, b;
	int c = a && b;
	int d = a || b;
	return 0;
}
 

  这样的一段非常简单的程序,编译器一般会如何实现它呢?

 

  首先,x86架构的CPU没有逻辑与和逻辑或的指令,那么,对于逻辑与和逻辑或,编译器会如何将其转换为x86指令集下的指令序列呢?

 

  使用gcc -S命令产生了编译产生的汇编代码。我通过在其中添加一些C风格的注释,帮助大家理解这段简单的代码。

 

	.file	"logic.c"
	.text
	.globl	main
	.type	main, @function
main:
.LFB0:
	.cfi_startproc
	pushl	%ebp
	.cfi_def_cfa_offset 8
	.cfi_offset 5, -8
	movl	%esp, %ebp //此时ebp寄存器保存了栈顶指针的位置(声明局部变量前)
	.cfi_def_cfa_register 5
	subl	$16, %esp //栈顶指针上移16字节,即申请四个int类型变量的栈空间
	cmpl	$0, -4(%ebp) //-4(%ebp)为变量a,比较变量a与立即数0
	je	.L2 //如果相等则跳转到L2
	cmpl	$0, -8(%ebp) //否则比较变量b与立即数0
	je	.L2 //如果相等则跳转到L2
	movl	$1, %eax //否则eax寄存器设为1
	jmp	.L3 //跳转到L3
.L2:
	movl	$0, %eax //eax寄存器设为0
.L3:
	movl	%eax, -12(%ebp) //结果保存到变量c(下面是或运算的部分了)
	cmpl	$0, -4(%ebp)
	jne	.L4
	cmpl	$0, -8(%ebp)
	je	.L5
.L4: //a不为0则会走到这里
	movl	$1, %eax //设定eax为1
	jmp	.L6
.L5: //a、b均为0则会走到这里
	movl	$0, %eax //设定eax为0
.L6:
	movl	%eax, -16(%ebp) //结果保存到变量d
	movl	$0, %eax
	leave
	.cfi_restore 5
	.cfi_def_cfa 4, 4
	ret
	.cfi_endproc
.LFE0:
	.size	main, .-main
	.ident	"GCC: (GNU) 4.6.1 20110908 (Red Hat 4.6.1-9)"
	.section	.note.GNU-stack,"",@progbits

  从这个汇编代码中就体现了C语言逻辑运算的截断特性。即对于与操作,第一个0的出现表示整个合取式为0;对于或操作,第一个1的出现表示整个析取式为1。那么,当我们在写逻辑运算表达式的时候,如果可能的话,应当考虑每个项为真或为假的概率,例如,在一个合取式a && b当中,b为0的概率比a为0的概率大得多,那么我们用b && a来代替a && b是可以起到提高效率的作用的。

 

  有些时候代码的优化工作会由编译器完成,不过,对于变量取值可能性的估计,编译器大多数情况是无法做到的,因此,在这种情况下,我们还是应该尽量人工完成这部分优化工作。

 

 

C语言逻辑与、逻辑或的编译

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
位运算 C语言中的位运算包括与(&),或(|),亦或(^),非(~). 下面的代码包扩了这些基本运算,
逻辑与操作符(&&) var result = true && false; 真值表: 逻辑与操作符可以应用于任何类型的操作
为什么需要说这个话题呢?因为很多朋友搞不大清楚他们的区别。 与运算,在编程中表示为& 非运算,在
【1】假设有一个池塘,里面有无穷多的水。现有2个空水壶,容积分别为5升和6升。问题是如何只用这2个
线性回归解决的问题是连续值的预测问题,逻辑回归解决的是离散值的预测问题,也就是分类问题。 之所
opencart采用mvc+l的架构 c: controller v: view l: language m: model 前台后台各一套独立的结构,
译自《LANGUAGE, PROOF AND LOGIC》 http://www.douban.com/subject/1900408/ Why learn an artific
BX网Email过来的安卓笔试题 1、商品摆放问题 在网上搜了下,最多的是基于Aprior算法的解决方案,还
C语言是一种高级语言,并且是编译型的语言。即一个用C写出来的源文件形式的代码,是可以被我们读懂
C 语言是一种高级语言,并且是编译型的语言。即一个用 C 写出来的源文件形式的代码,是可以被我们读
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号