printf及++,--结合顺序问题(转)
时间:2010-09-19 来源:tianchunlong
#include<stdio.h>
void main()
{
int i=1;
printf("%d%d%d%d%d",i++,i--,--i,++i,i);
}
我的最初想法,参数从左到右依次计算,也就是等同于:
printf("%d",i++);
printf("%d",i--);
printf("%d",--i);
printf("%d",++i);
printf("%d%",i);
先i++,所以输出i的值1后再i=i+1,此时输出为1,i=2
再i--,同样先输出i的值2后再i=i-1,此时输出为1 2,i=1
然后--i,先计算i=i-1=0,再输出i,此时输出为1 2 0,i=0
同样的++i,先计算i=i+1=1,再输出i,此时输出为1 2 0 1,i=1
最后输出i,所以最终输出是1 2 0 1 1
但是实际的运行结果并不是我想像的这样,这估计是因为c++的printf函数采用的是cdecl方式传递参数的关系,即参数入栈顺序是从右向左,自然执行的顺序也是自右向左啦,所以正确的顺序是:
先算最后的输出1
其次++i,输出1 2,i=2
再次--i,输出1 2 1,i=1
接着i--,输出1 2 1 1,i=1
最后i++,输出1 2 1 1 1
这就和我汇编查看运行的结果一致了:
1入栈
2入栈
1入栈
1入栈
1入栈
从这里,我们又可以看出这个顺序又和printf的输出顺序一致了,我猜测printf函数就直接根据这个顺序进行输出了
另外关于前面标记的“重点”
#include<stdio.h>
void main()
{
int i=1;
printf("%d%d%d%d%d",i--,i--,--i,++i,i);
cout<<i;
}
把第一个i++改成了i--可以看到最后输出的数字是-1,所以表明在执行完printf函数后执行了2次i=i-1
这也就是为什么为什么最后输出的2个都是1了
补充:
虽然知道i++,就是运算后再加,++i是先加再运算,书上都这么说。但这样其实并没有解释清楚其中的关系。对于简单的表达式入:a = b + (++i);和a = b + (i++)我们可以很好的理解。但对于一些复杂的关系我们却会迷糊。
举例:
printf("%d %d %d %d",i++,i--,++i,--i);(printf是从右向左的入栈)
a=(i--) + (i--) + (i--);
上面两个式子可能有些就会有些会弄错。
问题的关键在于要搞清楚是在什么的前后,不是++i或者i++的运算前后,而是指整个表达式的运算前后。若i=1,则第二个表达是的值为3.
void main()
{
int i=1;
printf("%d%d%d%d%d",i++,i--,--i,++i,i);
}
我的最初想法,参数从左到右依次计算,也就是等同于:
printf("%d",i++);
printf("%d",i--);
printf("%d",--i);
printf("%d",++i);
printf("%d%",i);
先i++,所以输出i的值1后再i=i+1,此时输出为1,i=2
再i--,同样先输出i的值2后再i=i-1,此时输出为1 2,i=1
然后--i,先计算i=i-1=0,再输出i,此时输出为1 2 0,i=0
同样的++i,先计算i=i+1=1,再输出i,此时输出为1 2 0 1,i=1
最后输出i,所以最终输出是1 2 0 1 1
但是实际的运行结果并不是我想像的这样,这估计是因为c++的printf函数采用的是cdecl方式传递参数的关系,即参数入栈顺序是从右向左,自然执行的顺序也是自右向左啦,所以正确的顺序是:
先算最后的输出1
其次++i,输出1 2,i=2
再次--i,输出1 2 1,i=1
接着i--,输出1 2 1 1,i=1
最后i++,输出1 2 1 1 1
这就和我汇编查看运行的结果一致了:
1入栈
2入栈
1入栈
1入栈
1入栈
从这里,我们又可以看出这个顺序又和printf的输出顺序一致了,我猜测printf函数就直接根据这个顺序进行输出了
另外关于前面标记的“重点”
#include<stdio.h>
void main()
{
int i=1;
printf("%d%d%d%d%d",i--,i--,--i,++i,i);
cout<<i;
}
把第一个i++改成了i--可以看到最后输出的数字是-1,所以表明在执行完printf函数后执行了2次i=i-1
这也就是为什么为什么最后输出的2个都是1了
补充:
虽然知道i++,就是运算后再加,++i是先加再运算,书上都这么说。但这样其实并没有解释清楚其中的关系。对于简单的表达式入:a = b + (++i);和a = b + (i++)我们可以很好的理解。但对于一些复杂的关系我们却会迷糊。
举例:
printf("%d %d %d %d",i++,i--,++i,--i);(printf是从右向左的入栈)
a=(i--) + (i--) + (i--);
上面两个式子可能有些就会有些会弄错。
问题的关键在于要搞清楚是在什么的前后,不是++i或者i++的运算前后,而是指整个表达式的运算前后。若i=1,则第二个表达是的值为3.
相关阅读 更多 +