宏定义要注意的问题

1,考虑以下代码:

include <stdio.h>

define max(a,b) a>b?a:b

int main(int argc, const char * argv[]) {
int a=3,b=2;
int c;
c=max(a++, b);
printf("%d",c);
return 0;
}
c=max(a++,b)等价与c=a++>b?a++:b而并不是先将a的值加一再将加一后的值和b进行比较。
c的输出结果是什么呢?
答案是4!
查看汇编代码,过程一目了然!
2,汇编代码如下:
//栈中14号位置记为a,栈中18号位置记为b
0x100000f26 <+22>: movl $0x3, -0x14(%rbp)//a=3
0x100000f2d <+29>: movl $0x2, -0x18(%rbp)//b=2
//将栈中14号位置的数(3)赋给寄存器edi;
0x100000f34 <+36>: movl -0x14(%rbp), %edi//edi=3
//将寄存器edi的值符给eax;
0x100000f37 <+39>: movl %edi, %eax//eax=3
//eax的值加一后再赋给eax,现在eax里的数为4
0x100000f39 <+41>: addl $0x1, %eax//eax=3+1
//将eax里的数赋给栈里的14号位置,即原来的3变为了4
0x100000f3c <+44>: movl %eax, -0x14(%rbp)//a=4
//比较栈中18号位置存放的数(2)和edi存放的数(2)
//注意:不是18号位置和14号位置进行比较!!!
0x100000f3f <+47>: cmpl -0x18(%rbp), %edi
//条件转移指令
0x100000f42 <+50>: jle 0x100000f5b ; <+75> at main.c:15
//将栈中14号位置的数(4)给EAX
0x100000f48 <+56>: movl -0x14(%rbp), %eax//eax=4
0x100000f4b <+59>: movl %eax, %ecx//ecx=4
0x100000f4d <+61>: addl $0x1, %ecx//ecx=4+1
0x100000f50 <+64>: movl %ecx, -0x14(%rbp)//a=5
0x100000f53 <+67>: movl %eax, -0x20(%rbp)//c=eax=4
c=a++>b?a++:b的流程图如下:箭头上的序号代表代码执行顺序


2.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Return-Oriented-Programming(ROP FTW) Author: Saif El-Sher...
    RealSys阅读 8,688评论 0 2
  • 本文首发于我的博客 Bomb Lab 实验代码见GitHub 简介 BombLab是CS:APP中对应第三章内容:...
    viseator阅读 14,822评论 0 14
  • 如果我病了,我就不用考试了 太阳落山之后,皮卡车在旷野里行驶,给人一种绝望的感觉。 读研的时候我曾经想先工作两年,...
    路建华阅读 877评论 1 0
  • 今天晚上为什么画了这么多不同的羽毛呢?因为昨晚那个美丽绚烂的梦境: 陪小伙伴去某公司参加二面(表问我为啥面试还要陪...
    晓冰小时光阅读 3,795评论 13 5
  • 文/灵懂 昨天拿起了朋友的ipad玩,刚好他的平板电脑里存了一款叫极品飞车的游戏。我很早就在我的手机里玩了这款游戏...
    颂亦阅读 3,624评论 0 1