digits;と書くと、インクリメントは式が終わったあとって聞いたんですけど、なってないみたいです。誰か説明してくれませんか。会社のブログログイン登録スタック・オーバーフローはプログラマーとプログラミングに熱心な人のためのQ&Aサイトです。digits;と書くと、インクリメントは式が終わったあとって聞いたんですけど、なってないみたいです。誰か説明してくれませんか。1)の様な気がします。0:55わかりました。ありがとうございました。2:551この質問は解決しましたか?解決した場合は参考になった回答を承認してください。承認は回答横のチェックマークを選択することで行えます。解決していない場合は、不明点を質問に追記してください。質問の修正は編集ボタンから行えます。副作用が発生する式の評価順序に依存しないが参考になるでしょうか。digits;C言語では、演算子の結合順序は定められていますが、評価順序は一部を除いて定められていません。=の左右どちらを先に評価するかは未定義です。左辺値を先に評価した場合d[digits++]が評価されます。d[0]を得つつdigitsが1にインクリメントされます。次にdigitsが評価されます。digitsは1です。最後に=が評価されd[0]は1となります。右辺値を先に評価した場合digitsが評価されます。digitsは0です。次にd[digits++]が評価されます。d[0]を得つつdigitsが1にインクリメントされます。最後に=が評価されd[0]は0となります。「一部を除いて」とは、よく知られているように&&や||、,は左辺値を先に評価することが定められていますし、?:も条件式が先に評価されます。個の銅バッジ2すごくよくわかりました。ありがとうございます。例でいう未定義動作のほうなのですけど、それを説明しだすと長くなるし大変ですよね。|4式が終わった後にインクリメントされてるからd[0]に1が入ってるんですよ。インクリメントは値を返した後に行われます。digitsの値をd[digits++]に使った後には加算済み。左辺の処理が終わった後にはdigitsは加算済みで、その後右辺が処理され、代入処理がうごいていると思われます。この左辺と右辺の演算順は定義されていなかったんじゃないかな?なのでビルド環境を変えると、右辺処理して、左辺処理して、インクリメント、代入と所望の動きが得られるものもあるんじゃないかと思います。Cでは定義されていない仕様もあって、その場合の結果は処理系に依存してしまいます。要は、コンパイラなどのバイナリを出力する過程で使われるプログラムによって、出力結果が変わってしまう事があるということですね。関数の定義などを見ていても、~の場合は未定義と説明されているのを見かけた事があるんじゃないでしょうか?どのビルド環境だとそうなるという解は持ち合わせていませんが、処理系に依存するプログラムを書いていると、移植などを行う際に想定外の挙動が起きたりするのでオススメ出来ません。個の銅バッジ1すごくよくわかりました。ありがとうございます。|この質問に回答するには、ログインする必要があります。求めていた回答ではありませんか?cのタグが付いた他の質問を参照する。declaredになる。2%sで配列の中身を表示さる時に、配列の先頭要素のアドレスを渡せば'\0'までの文字が表示される認識ですが、そうならない原因にがわからない。2標準ライブラリの関数の引数の定義の読み解き方がわからない。質問のフィードこのRSSフィードを購読するには、このURLをコピーしてRSSリーダーに貼り付けてください。従って情報を開示できることに同意したことになります。選択した項目のみ受け入れる。