先看一段代码
运行结果
开始感觉奇怪:明明i加1了为什么返回7,又或者为什么返回7而i加1了。return之后这个函数不是应该结束吗?。。。。。。
查了一些资料,终于明白了,根本问题在于i++这个表达式。这个表达式的作用是将i的值加1,重点是他有返回值,返回值是加1之前的i。ok,一切都明了了,最后返回7,i的值为8也很正常了啊,因为人家return返回了表达式的值啊。
记得当初本科学c的时候,老师总是说i++是先用后加,++i是先加后用,其实用表达式的返回值说明一下貌似更清晰啊。
下一个问题
我们把main函数修改一下
运行结果
额。。。为什么不是7 7 8呢,这个关系到可变参数的问题。
int printf(const char *format, ...);
这个是printf的函数原型,对于可变参数函数的那些参数会自右向走放入栈中,第一个参数当然就位于栈定了。ok啦,关键出来了,它是自右向左的,所以当然是8 7 7了。
static int i=7;
int test1()
{
return i++;
}
int main()
{
printf("%d\n",test1());
printf("%d\n",i);
return 0;
}
运行结果
7
8
开始感觉奇怪:明明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并没有给出标准啊,所以不同的编译器可能采取不同的处理方法,运行结果也就不同了哈。
综上所述,还是别用这种模糊的写法了。