• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:後置インクリメントについて質問)

後置インクリメントについて質問

このQ&Aのポイント
  • 質問文章では後置インクリメントについての説明があります。
  • 質問2では計算プロセスについての説明があります。
  • 質問3では左辺と右辺が+で繋がれていた場合の挙動についての疑問があります。

質問者が選んだベストアンサー

  • ベストアンサー
  • ssk38
  • ベストアンサー率44% (22/49)
回答No.2

質問:上から2番目のコメント文の中で、「10をそのまま加算し」とありますが、これは何に加算するんですか?何も入ってないyに加算するということでしょうか?それとも それともxにxを加算するという意味でしょうか?参考書の書き手の意図がわかりません、、。 説明が悪いです。 書き手の意図としては、計算中のなにもない箱(つまり0)があって、そこに10を加算するという意識だと思います。 式の(x++)を値10と評価し、xを11にする。 という表現のほうが適切でしょうか。 質問2:yが21、xが12になるプロセスは、 考え方(yの値が結局どうなるか)という点では正しいです。 ただ、実際には10+11を計算して21になってはじめてyに値が代入されます。yの値が逐次変化するわけではないです。 質問3:質問2の計算プロセスのように、左辺の変数が、右辺の変数が+で繋がれていた場合、左の項から順に足されていくということでしょうか? YESです。 演算子(=とか+とか++)には結合規則と優先順位というのがあります。(参考URL) まず優先度。 Javaの場合、=と+と++では、++が優先度が高い。次に+。次に=です。 つまり、 y=x++ + x++ は、 y=((x++) + (x++)) と書いてあるのと同じ意味になります。 次に結合規則。 複数並べた場合にどちらから評価(計算のこと)していくかを決定します。 +は左結合なので、左から順番に評価されます。だから、x++ + x++は10 + 11になります。 #ここでは足し算なのでどちらから評価されても影響ないですが、引き算だと順番が関係するので、重要です。 あまり意識しなくてもよいですが、=は右結合です。 ここでは特に問題ないですが、例えば以下の場合。 x = 1 y = x = 2 yの値は1でしょうか、2でしょうか。 =は右結合なので、x=2が先に評価され、yは2になります。

参考URL:
http://ozakih2000.blog.so-net.ne.jp/2008-05-01
すると、全ての回答が全文表示されます。

その他の回答 (3)

回答No.4

インクリメントを理解するためには、計算式を優先度順で分解する作業をまず行います。 優先度順は、 http://www.javaroad.jp/java_operator7.htm で、同じ優先度ならば、左から右です。(→問3) この原則に従って、y = x++ + x++;を分解すると、 (1) x++(左側) (2) x++(右側) (3) + (4) y= となります。 では、この順番に従って、計算してみましょう。 途中の数値を保存する場所が必要ですから、それはwとして、初期値は0です。 代入は、<- で書くとします。 (1) w1 <- w1 + x , x <- x + 1 つまり、w1 <- 0 + 10 = 10, x <- 10 + 1 = 11 2つの計算が復号しますが、後置インクリメントですから、この左の式から行われます。 (2) w2 <- w2 + x , x <- x + 1 つまり、w2 <- 0 + 11 = 11, x <- 11 + 1 = 12 (3) w1 <- w1 + w2 つまり、w1 <- 10 + 11 = 21 (4) y <- w1 つまり、y <- w1 以上のようなステップを踏みます。 計算が複雑でも、1つ1つの要素は分解され、それぞれ独立計算されます。 ちなみに、上記ステップでwとしましたが、これはワーキングレジスタというもので、 コンピュータ内部では、このレジスタを基本に計算を行います。 もちろん、CPUによって構造が違うので、上記のは単なる例で、 実際にはコンパイラがCPUの違いは吸収してくれます。(→問1)

すると、全ての回答が全文表示されます。
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

質問1: 既に言われているように, 説明の文章がおかしい. 質問2 を飛ばして先に質問 3: Java では, オペランドは常に「左から右」の順に評価されます. 例えば a+b+c なら 1. a を評価する (a の値が得られる) 2. b を評価する (b の値が得られる) 3. 1 と 2 で得られた値を使って a+b を計算する 4. c を評価する (c の値が得られる) 5. 3 と 4 で得られた値を使って a+b+c を計算する となります. かっこがあっても同じことで, a+(b+c) では 1. a を評価する (a の値が得られる) 2. b を評価する (b の値が得られる) 3. c を評価する (c の値が得られる) 4. 2 と 3 で得られた値を使って b+c を計算する 5. 1 と 4 で得られた値を使って a+(b+c) を計算する という処理をします. この「左から右」という評価順序は結合性には無関係で, 代入のような右結合の演算子であっても左から右に評価します. つまり a[i] = 3; では 1. a を評価する (配列のリファレンスが得られる) 2. i を評価する (i の値が得られる) 3. 3 を評価する 4. 1~3 で得られた値を使い, 配列 a のインデックス i の位置に値 3 を代入する という処理になります. 最後に質問2: 上の説明を読めばわかるかもしれませんが, その順序は微妙に間違っています. 正確には 1. y を評価する (今の場合, 代入の左辺なので変数 y の位置を求める). 2. x++ + x++ の左の x++ を評価する. 値として「x の現在の値」である 10 が得られ, 後置インクリメントの副作用としてこの時点で x の値は 11 になる. 3. x++ + x++ の右の x++ を評価する. 値として「x の現在の値」である 11 が得られ, 後置インクリメントの副作用としてこの時点で x の値は 12 になる. 4. 2 と 3 で得られた値を使って加算を行う: 10 + 11 = 21 が得られる. 5. 1 で得られた「変数 y の位置」に 4 で求めた値 21 を代入する. という順序になります. 2度目のインクリメントの位置が間違い... だけど, 多分こんな微妙なことを要求するプログラムはやめた方がいい.

すると、全ての回答が全文表示されます。
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

演算子には優先順位と結合法則というのがあって、それに従って評価されていきます。 これの例で言えば次の通り y=x++ + x++ ; → =と+とでは+の方が優先順位が高いので先に計算する y=(x++ + x++) ;  x++ + x++ ;  → +(加算)は左結合といって、左から計算する   +の左: x++   → xは10なので、「10」 (直後、xが1加算されxは11に)   +の右: x++   → xは11なので、「11」 (直後、xが1加算されxは12に)  → =の右は: 10 + 11  →10と11を足す →=の右は: 21 y=21 ; → =は右辺を左辺に代入するので yが21に 回答1: 上のように、なにも加算しません。おそらく、解説書の間違いです。 あるいは「10をそのまま加算の左辺に使用し、」「11をそのまま加算の右辺に使用し、」くらいの意味でしょう。 回答2: 正解は上で書いたプロセスです。yに代入されるのは最後です。 > y=10+ 11 ;//11をそのまま加算し、xを1加算します。xは12です。yは21になります。 とありますが、これは「後置インクリメントの説明」のためのもので、yへの代入まで説明するなら > y=10+ 11 ;//11をそのまま使用し、xを1加算します。xは12です。 > y=21 ; // 10+11を計算します(=の右辺は21)。=によりyは21になります。 とでも付け足した方がよいでしょう。 回答3: 先に書いたように、演算子には優先順位と結合法則があります。 結合法則に従って、演算子の左右どちらを先に計算するかが決まります。 とは言うものの、実質、代入演算子(複合を含む)以外が右が先なだけで、あとは左からです。

すると、全ての回答が全文表示されます。

関連するQ&A