/**************011.c 嵌套 if 语句****************************************
* 根据给出的输血者的资料(包括性别和体重),程序判断输出输血者对应的输血量。
* C语言编程百例第11个例子
*/
#include <stdio.h>
void main()
{
//sex代表输血者的性别,weight代表输血者的体重,cubage代表输血量
int sex, weight,cubage;
printf("请给出输血者的性别和体重:");
scanf("%d,%d",&sex,&weight);
if(sex>=0) //若变量sex的数值为非负数,则表示为男性
{
if(weight>=120)
{
cubage=200;
printf("此人应该输血:%d毫升\n",cubage);
}
else
{
cubage=180;
printf("此人应该输血:%d毫升\n",cubage);
}
}
else //否则,表示为女性
{
if(weight>=100)
{
cubage=150;
printf("此人应该输血:%d毫升\n",cubage);
}
else
{
cubage=120;
printf("此人应该输血:%d毫升\n",cubage);
}
}
}
对应的汇编
subl $12, %esp #printf
pushl $LC0
call _printf
addl $16, %esp
subl $4, %esp
leal -8(%ebp), %eax # scanf
pushl %eax
leal -4(%ebp), %eax
pushl %eax
pushl $LC1
call _scanf
addl $16, %esp
cmpl $0, -4(%ebp) # sex>0
js L4
cmpl $119, -8(%ebp) # weight>=120
jle L5 # 小于等于119跳,为啥编译器非要吧120搞成119呢?
movl $200, -12(%ebp) # cubage =200
subl $8, %esp # printf
pushl -12(%ebp)
pushl $LC2
call _printf
addl $16, %esp
jmp L3 # 退出, 编译器标号不知道咋算出来的,从L3开始,还不一定连续?
L5:
movl $180, -12(%ebp) # cubage=180
subl $8, %esp # printf
pushl -12(%ebp)
pushl $LC2
call _printf
addl $16, %esp
jmp L3 # 退出
L4:
cmpl $99, -8(%ebp) # weight>=100
jle L8 # 小于等于99跳
movl $150, -12(%ebp) # cubage=150
subl $8, %esp # printf
pushl -12(%ebp)
pushl $LC2
call _printf
addl $16, %esp
jmp L3 # 退出
L8:
movl $120, -12(%ebp) # cubage=120
subl $8, %esp # printf
pushl -12(%ebp)
pushl $LC2
call _printf
addl $16, %esp
L3:
leave
ret