010 else -if 语句
2015-01-14 11:32
211 查看
C 语言精彩编程百例 第10个例子
源程序如下:
对应的汇编内容:
1. else if 和 第9个例子 if语句 在处理上没有多大的差别。
2. 编译器在处理比较大小时,很有意思的优化:在比较整形数据是否小于$count 时,用$count-1参与运算, 估计大于也会使用类似的思路。
3. 用lea 是取出偏移地址指令,按照取偏移地址算出的值做数学运算。编译器不是每个数学运算都选择这种方式,估计这个方式效率也是有问题的。
源程序如下:
#include<stdio.h> void main() { int x,y; printf("请输入自变量 x:"); scanf("%d",&x); if(x<6) { y= x-12; printf("x=%d,y=%d\n",x,y); } else if(x<15) { y=3*x-1; printf("*x=%d,y=%d\n",x,y); } else { y=5*x+9; printf("*x=%d,y=%d\n",x,y); } }
对应的汇编内容:
subl $12, %esp pushl $LC0 call _printf addl $16, %esp subl $8, %esp leal -4(%ebp), %eax #scanf("%d",&x) pushl %eax pushl $LC1 call _scanf addl $16, %esp cmpl $5, -4(%ebp) # x 和 5 比较 , 想不到啊 jg L4 # 大于跳, 如果和4比较就是不小于跳,有jge, 或jns的吧? 为什么编译器会这么处理呢? 不明白 movl -4(%ebp), %eax # eax=x subl $12, %eax # eax=eax-12 movl %eax, -8(%ebp) # y=eax subl $4, %esp # printf pushl -8(%ebp) pushl -4(%ebp) pushl $LC2 call _printf addl $16, %esp jmp L3 #退出 L4: cmpl $14, -4(%ebp) # 和上面一样,在比较整形数据是否小于$count 时,用$count-1参与运算 jg L6 movl -4(%ebp), %eax # x=eax movl %eax, %edx # edx=eax addl %edx, %edx # edx*2 addl %eax, %edx # edx+eax ; 计算3*x, 貌似addl imull快所以~~ , 这个时候 addl %edx,%edx 是 4*x leal -1(%edx), %eax # %eax = %edx -1; 这个... lea是取有效地址的,但在这里它用来做数学运算了. 由于lea 是取出偏移地址的,所以 %eax中得到的是按照取偏移地址算出的值。 movl %eax, -8(%ebp) # y = %eax subl $4, %esp # printf pushl -8(%ebp) pushl -4(%ebp) pushl $LC3 call _printf addl $16, %esp jmp L3 # 退出 L6: movl -4(%ebp), %eax # %eax=x movl %eax, %edx # %edx =%eax sall $2, %edx # %edx=%edx<<2 ; 相当于 edx*4 addl %eax, %edx # %edx=%edx+eax ; 相当于 edx*5 leal 9(%edx), %eax # %eax=%edx+9 movl %eax, -8(%ebp) # y=%eax subl $4, %esp # printf pushl -8(%ebp) pushl -4(%ebp) pushl $LC3 call _printf addl $16, %esp L3: leave ret
1. else if 和 第9个例子 if语句 在处理上没有多大的差别。
2. 编译器在处理比较大小时,很有意思的优化:在比较整形数据是否小于$count 时,用$count-1参与运算, 估计大于也会使用类似的思路。
3. 用lea 是取出偏移地址指令,按照取偏移地址算出的值做数学运算。编译器不是每个数学运算都选择这种方式,估计这个方式效率也是有问题的。
相关文章推荐
- 奇偶数判断2(if else+switch语句)
- linux shell编程 if else 语句,case语句
- Golang教程:(八)if else 语句
- 黑马程序员:流控语句中的if-else的三种结构
- sql语句if。。。else使用和exists使用
- 关于mybatis根据传进来的参数执行不同的语句,类似于java中的if~else~语句
- 条件选择语句if else switch
- 10lession-if-else条件语句
- 李洪强漫谈iOS开发[C语言-037]-if else 语句
- 求 1+2+...+n, 要求不能使用乘除法、for、while、if、else、switch、case 等关键字以及条件判断语句 (A?B:C)。
- 求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。
- SQL 流程控制语句 之一 IF…ELSE语句
- JavaScript学习笔记15-if-else语句
- 求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。
- aspx页面中写if else 语句的方法,
- if/else语句匹配问题
- JavaScript 条件语句 If ... Else
- 实验三——for 语句及分支结构else-if
- 条件语句:if...else/switch
- 多个if语句和多个if else语句的区别