C中printf计算参数的顺序是从右到左。
对底层处理不清楚,具体先参考以下文章。
[1] http://wenku.baidu.com/view/edf0300a6c85ec3a87c2c5cc.html
[2] http://wenku.baidu.com/view/60e13b37a32d7375a41780c7.html
[3] http://www.cnblogs.com/jiayouniu/articles/2375448.html
以下为实验结果:
我也够无聊的,实验了这么多数据!可惜看不懂汇编代码,还是搞不懂内部如何执行的!
代码1
17行执行后,ptr指向6.
18行等价于
*(ptr) += 123;
ptr++;
18行执行后ptr指向7.
19行,从右到左运算,首先++ptr,此时ptr指向8,然后输出
VS2008的输出结果:8, 8
VC6.0的输出结果:8, 8
代码2
VS2008的输出结果:9, 9, 9
VC6.0的输出结果:9, 8, 8
代码3
VS2008的输出结果:6, 6, 6, 8
VC6.0的输出结果:7, 7, 8, 8
代码4_1
VS2008的输出结果:13, 12, 11, 10,9, 8
14
VC6.0的输出结果:8, 8, 8, 8, 8, 8
14
代码4_2
VS2008的输出结果:13, 12, 11, 10,9, 8,14
VC6.0的输出结果:8, 8, 8, 8, 8,8,8
代码5_1
VS2008的输出结果:14, 14, 14, 14,14, 14
14
VC6.0的输出结果:14, 13, 12,11, 10, 9
14
代码5_2
VS2008的输出结果:14, 14, 14, 14,14, 14,14
VC6.0的输出结果:14, 13, 12,11, 10, 9,8
代码6
VS2008的输出结果:8, 9
VC6.0的输出结果:8, 8
代码7
VS2008的输出结果:9, 8
VC6.0的输出结果:8, 8
代码8
VS2008的输出结果:10, 10, 10
VC6.0的输出结果:10, 10, 9
具体只是编译器内部的压栈顺序不同。
先根据以上数据作如下总结:真无聊
在printf函数中,无论i是指针变量还是普通变量
1.对于++i或--i而言(如代码5)
VS2008:自右至左,依次执行++或--操作,输出值为所有操作都执行完成后的值,
可理解为自右至左,依次执行,执行完成后,统一输出结果。
VC6.0:自右至左,依次执行++或--操作,输出值依次为每次操作执行完成后的值,
可理解为自右至左,依次执行,执行一个输出一个。
2.对于i++或i--而言(如代码4)
VS2008:自右至左,依次执行++或--操作,输出值依次为每次操作执行完成后的值,
可理解为自右至左,依次输出后执行,输出一个执行一个。
VC6.0:自右至左,依次执行++或--操作,输出值为所有操作都执行完成后的值,
可理解为先统一输出结果,再自右至左,依次执行。