C语言中的printf("%d,%d,%d\n",z++,++z,z++);问题
发布网友
发布时间:2024-10-22 18:20
我来回答
共2个回答
热心网友
时间:2024-10-22 19:09
楼主我和你的编译器结果是一样的。
关于这个问题的结果,本身就是和编译器有关的。
首先,不管怎样,计算结果都是从右往左(这和函数的参数压栈有关)。
只不过有些编译器是严格的按照从右往左计算,因此它们的结果是5,5,3.但是也有一些编译器不怎么老实,比如我和楼主的,像我们这样的编译器,凡是带前置自增运算符都会在最后被赋值(虽然依然会从左往右计算它)。
就拿这个问题来分析,首先计算最后一个z++,得到结果3,并立即赋值给这个参数;接着是第二个++z,会被计算得到结果5,但是不会被赋值;接着是第一个,得到结果5。所有的计算都结束后,第二个参数才会被赋值,因此得到结果6。所以最终结果是5,6,3。
楼主你可以试试这段语句:
int z = 3;
printf("%d %d %d\n", ++z, ++z,++z);
在你的编译器上最终结果会是6 6 6,因为从右往左计算,但是凡是带前置自增运算符的都会在最后被赋值。
同样地:
int z = 3;
printf("%d %d %d\n", ++z, ++z,z++);
这段语句的结果会是6 6 3,因为最后一个参数不会等到最后再赋值,而前两个会。
总之不管怎样,这种写法都是很不好的,楼主尽量少采用。
热心网友
时间:2024-10-22 19:13
我的编译器上是5 5 3,你反汇编一下看看。