return i++和可变参数

来源:互联网 发布:adobe全套软件下载 编辑:程序博客网 时间:2024/06/04 18:47
先看一段代码

static int i=7;int test1(){     return i++;}int main(){      printf("%d\n",test1());      printf("%d\n",i);      return 0;}

运行结果

78

开始感觉奇怪:明明i加1了为什么返回7,又或者为什么返回7而i加1了。return之后这个函数不是应该结束吗?。。。。。。

查了一些资料,终于明白了,根本问题在于i++这个表达式。这个表达式的作用是将i的值加1,重点是他有返回值,返回值是加1之前的i。ok,一切都明了了,最后返回7,i的值为8也很正常了啊,因为人家return返回了表达式的值啊。

记得当初本科学c的时候,老师总是说i++是先用后加,++i是先加后用,其实用表达式的返回值说明一下貌似更清晰啊。

下一个问题

我们把main函数修改一下

int main(){      printf("%d  %d  %d\n",i,test1(),i);      return 0;}

运行结果

8 7 7

额。。。为什么不是7 7 8呢,这个关系到可变参数的问题。

int printf(const char *format, ...);

这个是printf的函数原型,对于可变参数函数的那些参数会自右向走放入栈中,第一个参数当然就位于栈定了。ok啦,关键出来了,它是自右向左的,所以当然是8 7 7了。

但是啊,事实没有 这么简单啊,关于多个参数的处理顺序,c并没有给出标准啊,所以不同的编译器可能采取不同的处理方法,运行结果也就不同了哈。

综上所述,还是别用这种模糊的写法了。

原创粉丝点击