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

宏定义要注意的问题

作者: 未来不是梦而是汗水 | 来源:发表于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

相关文章

  • 宏定义要注意的问题

    1,考虑以下代码: include define max(a,b) a>b?a:b int m...

  • 【C/C++】宏(macro)定义与使用

    文章结构如下: 宏的定义 宏的替换与代码展开 宏的替换产生的问题 获取宏参数名称 宏参数的结合 宏的取消 宏定义的...

  • jni-01、宏、jni函数详解、数据获取、类型转换、签名规则

    宏语法 宏定义 解决循环拷贝的问题 T2.h 宏的取消 #undef 宏 宏变量 真实开发中:宏都是大写 宏函数...

  • C语言-宏定义转换为头文件

    问题描述:宏定义转换为头文件 源代码: 源代码:/长度单位转换-宏定义/#include #define Mile...

  • 宏定义

    # ## 把参数转换为字符数组 把参数连接在一起 注意:当宏参数是另一个宏的时候,需要注意的是宏定义例有用“#”或...

  • C语言 预处理指令

    一 .宏定义 #define 宏定义宏定义会在预处理的时候,用宏定义的值来替换宏的名称 定义格式 "#define...

  • swift&&OC

    宏定义 OC中的宏定义 swift中的宏定义 OC中宏定义的方式,在swift中是不可用的,在swift中,宏定义...

  • 准备:回顾c

    宏定义 关键字 define 定义一个常量的方法(即宏定义) 带参数的宏定义 宏函数的定义 使用宏函数的好处是,不...

  • 5月31

    今天学习了宏定义 宏定义分为:不带参数的宏定义和带参数的宏定义,不占用任何内存空间,宏定义时不加分号。 #defi...

  • 总结

    宏定义:宏定义的分为无参宏定义与有参宏定义。无参宏定义的一般形式为:#define 标识符 字符串。‘#’表示...

网友评论

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

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