昨天,有人问我下面的程序输出结果是什么,特此记录下来
#include <iostream> #define put(x) ((x)*(x)) using namespace std; int main() { int a[3] = {1,2,3}; int i = 0; int b = 3; int c; c = put(a[i++]); cout << c << endl; getchar(); return 0; }
用到了宏定义函数,在使用时需要展开,即
c = (a[i++]) * (a[i++]);
在vs 2008的环境下,输出是1, a[0]*a[0] = 1
个人的理解为当i++在一条语句当中出现两次时,编译器会做优化,即 i 先保持不变,取a[0] a[0] 之后,i 自增两次变成2。
#include <iostream> #define put(x) ((x)*(x)) using namespace std; int main() { int a[3] = {1,2,3}; /*int i=0; cout << a[i++] << endl;*/ int i = 0; int b = 3; int c; c = put(a[++i]); cout << c << endl; getchar(); return 0; }
稍稍做些变化,将上面的i++ 编程 ++i ,c = (a[++i]) * (a[++i]); ++i 出现两次在一个语句中。
此时,编译器在做处理时,会先将i 自增两次,最后结果为a[2]*a[2] = 9
总结出这一类编译器的规律, 即i++可以认为是先取i的值,后对i进行自增处理,则索性全部先取值,后自增。
++i 可以认为是先自增,再取值,则索性全部自增之后,再进行操作。
相关推荐
本资源为山东大学信号与系统实验八样例文件及宏定义函数,借助该文件可以较好地复现实验。 详解博客地址:https://blog.csdn.net/m0_52316372/article/details/125612586
详细罗列出宏定义和函数调用的区别,很全。。。
要写好C语言,漂亮的宏定义是非常重要的。宏定义可以帮助我们防止出错,提高代码的可移植性和可读性等。
2.编译器会对内联函数的参数类型做安全检查或自动类型转换(同普通函数),而宏定义则不会; 3.内联函数可以访问类的成员变量,宏定义则不能; 4.在类中声明同时定义的成员函数,自动转化为内联函数。文章(一)内联...
函数模板与宏定义。代码复用的不同方式的定义,包含了用函数模板实现代码复用,用宏定义展开为函数的定义与使用。
若字符串是表达式,我们称之为函数式宏定义,那函数式宏定义与普通函数有什么区别呢?我们以下面两行代码为例,展开描述:函数式宏定义:#define MAX(a,b) ((a)>(b)?(a):(b))普通函数 :MAX(a,b) { return a>b?a:b;}...
InstFileNameDef 在光标处插入宏定义,这样.h文件被多次包含时,编译时只包含一次 * 8. HowToUseMacroFunction 本文所定义宏函数使用说明 ********************************************************************...
宏定义宏与函数的区别文件包含条件编译PPT课件.pptx
C语言中宏定义技巧.doc
宏定义宏与函数的区别文件包含条件编译PPT学习教案.pptx
函数宏,即包含多条语句的宏定义,其通常为某一被频繁调用的功能的语句封装,且不想通过函数方式封装来降低额外的弹栈压栈开销。 函数宏本质上为宏,可以直接进行定义,例如: 复制 #define INT_SWAP(a,b) \ int ...
C语言学习 讲解了宏的定义,带参数宏定义,带参的宏与函数区别,文件包含等
关于C语言宏定义的用法,作了一个总结,除了常用宏定义外,还有类似函数的宏的用法
Source Insight中的宏语言类同于MS Office中的VBA,也具有程序化执行用户预定义操作的通用宏语言功能。VBA功能的强大就不用多作说明了,而Source Insight的宏语言也不逊色。以下就以项目中一次实际应用为例进行说明...
在宏定义中,“宏名称”和“宏字符串”是通过“空格”来区分的,某些朋友不要混淆了,接下来请祥看本
NULL 博文链接:https://jacky-dai.iteye.com/blog/868385
chap函数与宏定义PPT课件.pptx
chap函数与宏定义学习教案.pptx
C宏定义,预处理,函数等.txt