C语言中参数执行顺序及a++与++a实现的区别
来源:互联网 发布:淘宝网房产司法拍卖 编辑:程序博客网 时间:2024/06/05 01:57
首先结论:(1)void func(int a, int b, int c, int d)中参数按dcba,即从右至左的顺序依次入栈。
(2)printf("%d, %d\n",(a++)*a,a+=2)中从右至左依次计算。
即使(1)(2)情况下,参数都是从右到左的依次被执行。
(3)a++先使用a的值再自增,产生临时变量,++a先自增再使用新的a的值,不产生临时变量。
关于这一点可在下面的程序中详细体现。
#include <iostream>using namespace std;void func(int a, int b, int c, int d){printf("%d ", a);printf("%d ", b);printf("%d ", c);printf("%d ", d);printf("\n");}int main(){int a, b, c;a = 2;b = 2;c = 2;printf("%d, %d\n",(a++)*a,a+=2);func(b++,b,b++,b++);/*a++先使用a的值再自增,产生临时变量*/func(++c,c,++c,++c);/*++a先自增再使用新的a的值,不产生临时变量*/}首先printf中,从右到左依次计算表达式的值,再从左往右依次输出(2)。这里需要注意的是a+=2, 实际上是要输出&a地址上的值,所以即使在第一次计算中这一部分的值为4, 但是在(a++)*a中a的值被增加为5,所以在输出时a+=2这一部分的输出为5。
结果如图
接下来看2个func的输出,func(b++,b,b++,b++),执行后结果为4 5 3 2,这里参见第一条(1)函数的参数从右往左依次入栈,同时注意到第二个参数b是要输出&b上的值,所以在第一个参数b++改变b的值后,第二个参数仍会改变。
但是func(++c,c,++c,++c),执行后4个输出全为5就让我疑惑了好一阵了,最终我找到了第三条解释(3),即关于a++和++a实现原理的不同,a++先使用a的值再自增,产生临时变量,所以在func(b++,b,b++,b++)中每一个b++都会产生一个临时变量,最终printf输出的时临时变量地址上的值,所以3个b++之间并不相互影响,各自会输出入栈时状态的值。 而++a先自增再使用新的a的值,不产生临时变量,所以func(++c,c,++c,++c),中4个参数都是要输出&c地址上的值,他们的变化相互影响,所以最终输出c的值,即结果为4个5.
0 0
- C语言中参数执行顺序及a++与++a实现的区别
- 深入剖析C函数参数的结合顺序及a++和++a的区别
- C语言中 A||B&&C的执行顺序是怎么的?
- 关于C语言中printf函数的参数执行顺序
- C语言中Node * a,和Node* &a的区别
- C语言中 a-- 和a-1 的区别
- 研究C语言的参数执行顺序
- 彻底搞清 C/C++中a++与++a的区别
- 彻底搞清 C/C++中a++与++a的区别
- 彻底搞清 C/C++中a++与++a的区别
- 关于C语言中a=a++与a=++a的研究
- a++与++a及a--和--a的区别
- C语言中值得深入知识点----数组做函数参数、数组名a与&a区别、数组名a的"数据类型"
- 数组中a与&a的区别
- C语言-数组a[]:a与&a的不同
- 初学 c语言 关于指针------什么是指针 int *a 与 *a的区别
- C语言++a与a++的实现机制与操作符结合优先级
- 关于a标签的onclick与href的执行顺序
- c/s与b/s的区别
- C++强制类型转换和RTTI
- windows 编程(1)
- IE11 F12工具报错,ie11开发人员工具不能正常使用
- Scala——总计架构目录
- C语言中参数执行顺序及a++与++a实现的区别
- SQL中的CASE使用方法
- CSS设置DIV居中
- jquery简单动画效果(上)
- printf输出各种格式(转)
- Android学习历程之【安装】
- foj2155 - 盟国 (并查集的删除操作)
- [223]Rectangle Area
- 讨论