美文网首页
宏定义要注意的问题

宏定义要注意的问题

作者: 未来不是梦而是汗水 | 来源:发表于2018-03-26 16:37 被阅读0次

    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

    相关文章

      网友评论

          本文标题:宏定义要注意的问题

          本文链接:https://www.haomeiwen.com/subject/fuercftx.html