C中printf计算参数的顺序

Cprintf计算参数的顺序是从右到左。

对底层处理不清楚,具体先参考以下文章。

[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:自右至左,依次执行++--操作,输出值为所有操作都执行完成后的值,

可理解为先统一输出结果,再自右至左,依次执行。



你可能感兴趣的:(printf)