質問: 0); return 0; } ``` ---実行結果--- digits=1 d[0]=1 if enter 1, end. ---僕の理想の実行結果--- digits=1 d[0]=0 ←ここが0 if enter 1, end.
回答: 式が終わった後にインクリメントされてるから`d[0]`に`1`が入ってるんですよ。 インクリメントは値を返した後に行われます。 つまり、`digits`の値を`d[digits++]`に使った後には加算済み。 なので、左辺の処理が終わった後には`digits`は加算済みで、その後右辺が処理され、代入処理がうごいていると思われます。 ただ、この左辺と右辺の演算順は定義されていなかったんじゃないかな? なのでビルド環境を変えると、右辺処理して、左辺処理して、インクリメント、代入と所望の動きが得られるものもあるんじゃないかと思います。 Cでは定義されていない仕様もあって、その場合の結果は処理系に依存してしまいます。 要は、コンパイラなどのバイナリを出力する過程で使われるプログラムによって、出力結果が変わってしまう事があるということですね。 関数の定義などを見ていても、`~の場合は未定義`と説明されているのを見かけた事があるんじゃないでしょうか? どのビルド環境だとそうなるという解は持ち合わせていませんが、処理系に依存するプログラムを書いていると、移植などを行う際に想定外の挙動が起きたりするのでオススメ出来ません。