题记:回头看看原本学过的知识,发现那些原本以为理解了的皮毛都突然让自己变得陌生。逐步学习,不懈努力。

测试题目时发现得出的结论与自己给出的不同,于是查阅资料,重新学习宏定义相关的文章。在C与C++编程中宏定义命令经常使用,不过常作为常量,而函数式则用的比较少。做题时以普通的函数理解方式进行解答,发现错误后及时更正,也提醒自己学习要扎实。

题目如下:#defineMAX(a,b)?a:bint test(){int a=3,b=2;return MAX(--a,b+++1);}请给出函数运行返回值。

这里要注意的是:若函数参数为表达式,则普通函数的调用与函数式宏定义的替换过程是不一样的。普通函数调用时为先求出实参表达式的值再传给形参,如果有++,--等操作只需要执行一次,而宏定义函数中则需要展开,如上题中MAX(--a,b+++1)在宏定义函数中的展开式为:result= (--a>b+++1)?--a:b+++1;执行次数未必为一次。以下为测试代码:

#define MAX(a,b) ((a>b)?a:b)
#include <iostream>using namespace std;/*
MAX(--a,b+++1)的展开式为:    k=(--a>b+++1)?--a:b+++1;
执行时直接由b+++1 (3)(运算后b++变为3)    跳转至 b+++1    (变为4)(运算后b++ 变为4)
--a 只执行一次若为 MAX(--a,++b+1); ++b+1(3) ==> ++b+1 (5)
*/
int Test1()
{
int a=3,b=2;
int k= MAX(--a,b+++1);cout<<"a= "<<a <<" b= "<<b<<endl;
return k;
}int Test2()
{
int a=3,b=2;
int k= MAX(--a,++b+1);cout<<"a= "<<a <<" b= "<<b<<endl;
return k;
}
int main()
{
int result1,result2;
result1 = Test1();
result2 = Test2();
cout<<"Test1 :"<<result1 << " Test2 :"<<result2<<endl;return 0;
}

 

参考:http://www.cnblogs.com/dong008259/archive/2011/12/27/2302625.html

转载于:https://www.cnblogs.com/ace-code/archive/2012/10/05/2712067.html

关于函数式宏定义的学习相关推荐

  1. 函数式宏定义与普通函数的区别?C语言宏定义和宏定义函数 ?

    http://www.jb51.net/article/41869.htm 尽管函数式宏定义和普通函数相比有很多缺点,但只要小心使用还是会显著提高代码的执行效率,毕竟省去了分配和释放栈帧.传参.传返回 ...

  2. C语言中关于宏定义的学习

    1.C语言中宏定义的使用 2.GCC官方文档 3.C语言宏定义的几个坑和特殊用法 转载于:https://www.cnblogs.com/Brandon0807/p/11146344.html

  3. 如何用C语言改变宏定义的大小,C语言中宏定义使用的小细节

    C语言中宏定义使用的小细节 #pragma#pragma 预处理指令详解 在所有的预处理指令中,#Pragma 指令可能是最复杂的了,它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作.#p ...

  4. 大牛深入浅出讲解C语言#define宏定义应用及使用方法

    在C语言中,我们使用#define来定义宏.在C程序编译的预处理阶段,预处理器会把宏定义的符号替换成指定的文本. 不带参数的宏 关于宏最常见的就是用来定义数值常量的名称,即没有参数的宏定义,采用如下形 ...

  5. 深入浅出讲解C语言#define宏定义应用及使用方法

    在C语言中,我们使用#define来定义宏.在C程序编译的预处理阶段,预处理器会把宏定义的符号替换成指定的文本. 不带参数的宏 关于宏最常见的就是用来定义数值常量的名称,即没有参数的宏定义,采用如下形 ...

  6. VC预处理指令与宏定义的妙用

    VC中预处理指令与宏定义的妙用 刚接触到MFC编程的人往往会被MFC 向导生成的各种宏定义和预处理指令所吓倒,但是预处理和宏定义又是C语言的一个强大工具.使用它们可以进行简单的源代码控制,版本控制,预 ...

  7. 函数宏定义 与函数自定义

    为什么在C语言中要有函数宏定义这种形式呢?宏定义可以帮助我们防止出错,提高代码的可移植性和可读性等. 在软件开发过程中,经常有一些常用或者通用的功能或者代码段,这些功能既可以写成函数,也可以封装成为宏 ...

  8. 宏定义处理特殊字符 -_c语言编译与预处理命令

    所谓预处理,是指源文件在进行编译的第一遍扫描之前所作的工作,由预处理程序完成.当对一个源文件进行编译时,系统将自动引用预处理程序对源程序中的预处理部分进行处理,处理完毕自动进入对源程序的编译. 在前面 ...

  9. c语言里宏定义算变量嘛,C语言宏定义的一些总结

    较大的C语言项目都会用大量的宏定义来组织代码,比较经典的代码就是Linux Kernel的头文件中用的宏定义.看起来宏展开就是做个替换而已,其实里面有比较复杂的规则,有关宏展开的语法规则此小结力图整理 ...

最新文章

  1. SIC插槽,WSIC插槽,XSIC插槽
  2. phpstudy如何安装景安ssl证书 window下apache服务器网站https访问
  3. 非正交坐标系-模态正交的物理及几何意义
  4. (转)Java任务调度框架Quartz入门教程指南(二) 使用job、trigger、schedule调用定时任务...
  5. volatile和synchronized关键字
  6. PCWorld测评的2012版世界级杀毒软件
  7. LabWindows图表显示
  8. 第三方支付竞争走向下半场 汇付天下构建多方共赢新生态
  9. 怎么申请学校邮箱?学校邮箱格式有哪些?
  10. 2011 我们的七夕
  11. 把notepad++添加到右键打开方式(解决 打开方式 没有notepad++编辑器情况)
  12. Java开发的基中之基
  13. python爬取王者荣耀高清图
  14. 计算机java项目(毕设课设) 之 含文档+PPT+源码等]基于SSM的足球联赛管理系统
  15. Java: 获取MAC网络地址
  16. POI使用详解 java 复杂excel导出
  17. ch06: 决胜秋招
  18. 如何在MATLAB中调用(运行)“用Python写成的函数或脚本”
  19. win11右键直接显示更多选项
  20. “泥腿子”办银行 浙江省首家农村资金互助社成立

热门文章

  1. Android进阶:七、Retrofit2.0原理解析之最简流程【上】
  2. docker swarm英文文档学习-8-在集群中部署服务
  3. 云企业网的应用于功能详解
  4. 从@property说起(四)深入成员变量
  5. android 设置布局横屏竖屏
  6. 如果list中既包含字符串,又包含整数,由于非字符串类型没有lower()方法,所以列表生成式会报错:...
  7. golang多核的使用
  8. Orders matters: seq2seq for set 实验
  9. 《简明电路分析》——1.6节简单电路分析实例
  10. SegmentFault 技术周刊 Vol.17 - 听说你还没用上 AngularJS