Printf函数进栈顺序
示例说明程序1
# include <stdio.h>
main()
{
int i=1;
printf(”%d %d %d”, i , i++, i++);
}进栈顺序:
1. i=1;算最后一个i++,i=2;将加之前i的值1送入堆栈。
2. i=2;算倒数第二个i++,i=3;将加之前i的值2送入堆栈。
3. i=3;计算i,i=3;将加之前i的值3送入堆栈。
输出结果为(出栈顺序):3 2 1
示例说明程序2
# include <stdio.h>
main()
{
int i=1;
printf(”%d %d %d”, i , ++i, ++i);
}进栈顺序:
1. i=1;算最后一个++i,i=2;将加之后i的值2送入堆栈。
2. i=2;算倒数第二个++i,i=3;将加之后i的值3送入堆栈。
3. i=3;计算i,i=3;将加之后i的值3送入堆栈。
输出结果为(出栈顺序):3 3 2
示例说明程序3
# include <stdio.h>
main()
{
int i, j, k; i=1; j=2; k=3;
printf(”%d %d %d”, i , j, k);
}进栈顺序:
1. k=3;算k,k=3;将k的值3送入堆栈。
2. j=2;算j,j=2;将j的值2送入堆栈。
3. i=1;计算i,i=1;将i的值1送入堆栈。
输出结果为(出栈顺序):1 2 3
C语言都是从右向左入栈的。
Pascal语言是从左到右。
|
编译器相关。
结论:
我们应尽量避免假设函数入栈顺序是自右向左的, 并无畏的加以应用.
不管是编译器bug, 还是其它, 我们都要要考虑不同编译器/版本差异会引起的结果差异.