質問: (n++) & 15; printf("%d\n", n); } } 1~16の間を繰り返して表示してくれそうな気がするのですが、実際は全部0に なってしまいますが、どうしてなんでしょうか?
回答: ループの冒頭で n = 0 の時 (n++) & 15 の式の評価は++ がポストインクリメントだから n++ の「式としての評価」は 0。 従って (n++) & 15 の「式としての評価」は 0 になります。 n= ~ の nへの代入では 左辺の式の評価から 0 が代入されることになるし その一方で ポストインクリメントで nは インクリメントされる ことになります。 つまり、nに対して n = 0 と n = n + 1 の2つの処理が有るわけです。 規格上どういう順序で実行されるべきか、決まってないのか 知りませんが、とても結果が不明瞭な処理です。 一つの式の中に副作用として同じ変数に対する変更が 2個存在する というのは書くべきではない式でしょう。