C言語初探のprintfスタック順序

1074 ワード

編頭に書く:
異なるコンパイラの下で結果が異なり、この例のテスト環境はdevcpp 5である.3.0.1 .   
——————————————————————————————————————————————————————————————————————
まずコードを見て、出力を当ててみましょう.
x=1;   printf("%d %d
",x,x++); x=1; printf("%d %d
",x++,x); x=1; printf("%d %d %d
",x,x++,x); x=1; printf("%d %d %d %d
",x,++x,x++,x);
如~:
2 1
1 2
2 1 2
3 3 1 3

ここを見ると、左から右へ計算したり、右から左へ計算したり、乱順から計算したりしているように見えます.少し気がふさいでいるのではないでしょうか.
実際にprintfを処理する場合、スタックの順序は右から左、すなわち右から左の計算(「計算」は「出力」に等しくない)である.
計算時に、x++に遭遇すると、このときのxの値が最後の出力結果として記録されます.xと++xに遭遇した場合、このときの計算結果を最終的な出力とすることはなく、xの値だけが修正され、最終的な出力時にxの値が出力される(したがって++xとxの結果は常に同じである).
どうしてこんなことになったの?上級者の説明を参照してください.
a++の結果については,ebpアドレス関数スタック空間が中間結果を記録し,最後にprintfにスタックを圧着する際にスタックから中間結果を取り出す.一方,++aの結果,レジスタ変数を直接圧縮し,レジスタはすべての自己増幅動作を経た.(ソース:http://www.zzzj.com/html/20090609/71613.html)
[小試技]
a=1; 
printf("%d %d %d %d %d %d
",a++, ++a, a++, ++a, a++, ++a );

答え:[6 7 4 7 2 7]
(解答枠を選んで結果を見ると、わかるよ~)