C语言之隐蔽问题[01 参数传递时参数列表初始化顺序]

   很久之前就学了C语言,可是当时掌握并不好,而且最近几年做科研并不使用它,因此逐渐生疏。最近又从头开始复习,我发现在学习了matlab/Python/Js/SQL等语言,尤其是细读《thinking in java》之后,很多问题开始被较多地关注,而且总会有新的发现。曾经读过一本关于C语言陷阱的书,名字已经记不起来了,但对我影响最深的莫过于对循环体中"i<N"的总结了。好像跑远了,第一篇技术博文,这算是前记吧。

   在C语言系统中,其实存在许多“陷阱”,有些是比较隐蔽的问题,一般不会给编程带来什么影响,但如果不注意这些问题,一旦出现bug就很棘手了。在后续会陆续列举一些在C语言编程中我们通常会忽略的一些问题。


问题描述

   在如test(int x,int y,int z)的函数中,有多个参数组成的参数列表,那么在进行值的传递时,究竟是按照x→yz的顺序还是按照其他顺序来进行参数的初始化(或对形参的赋值)呢?

问题验证

   为了解决这个问题,使用同一个变量的自身变化来进行观察。比如 int x;传入 x,x++,x++。


测试程序

#include "stdio.h"

void test(int x, int y, int z) {
	printf("       x\t     x++\t     \tx++\n");
	printf("%8d\t%8d\t%8d\n", x,y,z);
	printf("%#x\t%#x\t%#x\n", &x,&y,&z);
}

int main() {
	int a=0;
	test(a, a++, a++);
}

测试结果

  zbook上的visual stidio 2015 环境下测试结果:

   从结果可以看到,首先给 最右边的z赋值,再给中间的y赋值,最后给最左边的x赋值;即参数表的赋值是从右往左的。
即,如下图所示方式:
另外,从存储地址看,最后赋值的形参x存储在地址较小的地方,从函数运行看,应该是在栈中靠上的位置。

zbook上codeBlocks上的运行结果:
可见与在visual studio 2015 上的结果保持一致,参数列表的初始化顺序为从右至左。

举一反三
根据上述结果,推断下述代码的结果是什么?

#include "stdio.h"

int main() {
	int x=2;
	printf("%d\t%d\n",x,x++);
}


结果:

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值