最近在思考一个奇怪的问题:函数在传参的时候分先后吗?
C语言的执行是按顺序的,按理说两个表达式用逗号隔开以后,先执行逗号前的,再执行逗号以后的。
于是做了个实验:
#include <stdio.h>
int main(void)
{
char *p;
p = "123456";
printf("%c %c\n", *p++, *p);
printf("%c %c\n", *p++, *p);
return 0;
}
执行结果是:
1 1
2 2
第二行printf的p被第一行printf中的++影响了,变成了2,这我理解。
但同一行内,printf传入p的顺序如果有先后,第二个p就不会和第一个p相等。出现这样的情况,说明两个p是同时传入printf并成为副本的,但这不是违背了顺序执行的常识么?有没有人能解答这个问题?
c/c++函数参数的读取顺序从右向左
使用printf函数时还要注意一个问题,那就是输出表列中的求值顺序。不同的编译系统不一定相同,可以从左到右,也可从右到左。Turbo C是按从右到左进行的。
vc6.0
例1
int main(){
int i=8;
printf("%d\n%d\n%d\n%d\n%d\n%d\n",++i,--i,i++,i--,-i++,-i--);
}
//摘自http://c.biancheng.net/cpp/html/33.html
例2
int main(){
int i=8;
printf("%d\n",++i);
printf("%d\n",--i);
printf("%d\n",i++);
printf("%d\n",i--);
printf("%d\n",-i++);
printf("%d\n",-i--);
}
这两个程序的区别是用一个printf语句和多个printf 语句输出。但从结果可以看出是不同的。为什么结果会不同呢?就是因为printf函数对输出表中各量求值的顺序是自右至左进行的。在第一例中,先对最后一项“-i--”求值,结果为-8,然后i自减1后为7。 再对“-i++”项求值得-7,然后i自增1后为8。再对“i--”项求值得8,然后i再自减1后为7。再求“i++”项得7,然后i再自增1后为8。 再求“--i”项,i先自减1后输出,输出值为7。 最后才求输出表列中的第一项“++i”,此时i自增1后输出8。
C/C++标准中没有指定函数参数的计算顺序,因此不同的编译器对函数参数计算顺序的实现有可能是不一样的,这样你上面的代码在不同编译器上得到得结果也就不一样,不信你试试用clang编译上面的代码,结果就不一样。所以以后不要写这种代码。
详情请参考下面链接
https://en.cppreference.com/w/c/language/eval_order