大部分人应该都对printf函数比较了解,这也是作为c语言初学者第一个遇到的函数吧!!
哈哈,就是那个什么(打印hello,world)啊,当时当被问到printf函数的执行顺序的时候,好多人应该都不清楚,但是作为对c语言了解,并且用惯了vc6.0的人来说,可能知道,它的运算顺序是从右往左,但是,真的是这样的吗??
下面我们通过如下的语句来验证一下:
printf("%d , %d ,%d\n",i++, ++i, i);
程序1:
- #include <stdio.h>
- #include <conio.h>
- int main(){
- int i = 3;
- printf("%d , %d ,%d\n",i++, ++i, i);
- printf("i is %d\n", i);
- getch();
- return 0;
- }
window(VC6.0)
根据两个printf函数打印的结果以及第一个printf函数打印最右边的值
可以得出简单的结论:在vc6.0中,printf函数的结合性是从右到左的:
最右边为3,然后进行中间的++i,由于先执行加1运算(之后i=4),所以整体中间的输出为4,最后执行最左边的i++,由于是先用原值,所以此刻输出为4,等到printf函数执行完之后,i执行加1操作,此刻i变为5
所以第二个printf函数打印i的值为5
linux,window(dev-C++)
哈哈,是不是懵逼了呢??linux底下,并不是这样是实现的啊!!!
恩恩,仔细想了一会还是可以想明白的:
Linux中的printf是从左往右的
第一个printf函数先执行的是最左边的i++(这里说,应该用原值参与后续运算,然后加1,但是,我觉得在linux里面,printf函数如果参数有自增自减,那么请无视后续运算符),故i+1,变成了4,之后遇到(++i)(请无视后续运算符,哈哈),直接加1,所以i的值此刻是5,再之后遇到i输出,输出5,此时i还是为5
第二个printf函数打印i的值,所以输出为5
简单总结:
printf函数参数执行的问题:
VC6.0: 从右到左
linux,dev-c++: 从左到右
当printf函数混合自增自减的时候
对于VC6.0而言:将printf函数当作后续运算符(对前置后置而言)
linux,dev-c++:请无视后续运算符(对前置后置而言),就当作是没有
对自增自减运算符还有疑惑的同学可以参考这篇博客:http://blog.csdn.net/msdnwolaile/article/details/50614626