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

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

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

java解説書に以下のような説明がありました。この説明は、後置インクリメントについての説明です。 「xは10が代入されているとする。 y=x++ + x++ ; //最初の状態。xは10です y=10+ x++ ;//10をそのまま加算し、xを1加算します。xは11です。 y=10+ 11 ;//11をそのまま加算し、xを1加算します。xは12です。yは21になります。」 質問:上から2番目のコメント文の中で、「10をそのまま加算し」とありますが、これは何に加算するんですか?何も入ってないyに加算するということでしょうか?それとも それともxにxを加算するという意味でしょうか?参考書の書き手の意図がわかりません、、。 質問2:yが21、xが12になるプロセスは、 yにx(10)が加算される      ↓ yにx(10)を代入した(計算した)「直後」であるから、後置インクリメントによりxが1増えて、xが11になる      ↓ x(11)をyに代入 ↓ yは21になる ↓ yに11を代入した(計算した)「直後」であるから、後置インクリメントによりxが1増えて、xが12になる こういうことでしょうか? 質問3:質問2の計算プロセスのように、左辺の変数が、右辺の変数が+で繋がれていた場合、左の項から順に足されていくということでしょうか?

  • Java
  • 回答数4
  • ありがとう数0

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

  • ベストアンサー
  • 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

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

    以下の式はxに10が代入されているとします。 そして、yに21が代入されるまでのプロセスです、それを見た上で私の質問に答えてください。 y=x++  + x++ ; 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 を代入する. 質問:上記のプロセスのように、後置インクリメントは、「変数を評価した直後」に値が増えるんですよね?

    • ベストアンサー
    • Java
  • 後置インクリメントの計算過程について

    後置インクリメントの計算過程について Javaに関して初めての質問となります。よろしくお願いいたします。数日前に学習し始めたばかりの超・初心者です。 現在、基本的な演算について、インクリメント・デクリメントのそれぞれ前置と後置の違いを学習したところなのですが、どうも後置の理解が完璧でないようで、仮に変数をxとした場合、式内にxが二度出てくる場合の後置の計算が理解できません。 具体的には int x, y; x = 10; y = x++ + x++; 上記でコンパイルした結果、y=21となる過程を教えていただけませんでしょうか。 私の理解では、x++は計算に使用した後にxに1を加算するので、まず y = 10 + 10 で、y = 20 となり、その後にxに1を加算してx=11が私の理解です。 よろしくお願いいたします。

    • ベストアンサー
    • Java
  • 後置インクリメントの挙動が不明で困ってます

     Eclipse 4.7 Java 8でプログラミングをやっています。 いまスレッドのプログラミングをやっているのですが、後置インクリメント の挙動がC言語の時と違っていて戸惑っています。 問題は、変数 idx でこの変数の値が加算されていきません。 条件演算子がある箇所で加算しているのですが、後置インクリメントでも 加算されていくはずですよね? しかしそうなりません。値は0のままです。 なぜそうなるのか分からないので質問しました。 答えられたらよろしくお願いします。 import static java.lang.System.out; import java.applet.Applet; import java.awt.Graphics; public class JavaThread4 extends Applet implements Runnable { // TODO 自動生成されたメソッド・スタブ final String HelloWorld = "Hello World"; volatile int idx; Thread helloThread = null; public void init() { idx = 0; out.println("init"); } public void paint(Graphics g) { g.drawString(HelloWorld.substring(0, idx), 30, 30); } public void start() { out.println("start"); if(helloThread == null) { helloThread = new Thread(this); helloThread.start(); } } public void run() { out.println("run"); for(;;) { try { Thread.sleep(400); }catch(InterruptedException e) { } out.println(" idx = " + idx); idx = (idx < HelloWorld.length()) ? idx++ : 0;//この部分が問題の部分です repaint(); } } }

    • ベストアンサー
    • Java
  • Perlインクリメントデクリメント

    あっていますでしょうか? インクリメント演算子とデクリメント演算子 インクリメント(加算)演算子は変数の数値を一つ増やす。 デクリメント(減算)演算子は変数の数値を一つ減らす。 ++ インクリメント演算子 変数の値を1増やす $a++ ++$a $aの値を1増やす -- デクリメント演算子 変数の値を1減らす $a-- --$a $aの値を1減らす $a=1; 変数$aに1を代入する print "はじめは$aでした。\n"; $aの代わりに1が入り はじめは1でした。と表示する。 $a++; $aに1を足す。 print "1増えて$aになりました。\n"; $aの代わりに2が入り、1増えて2になりました。 と表示する。 $a--; $aから1減らす。 print "1減って$aに戻りました。\n"; $aの代わりに1を入れて 1減って1に戻りました。 と表示する ↓ 実行結果 ↓ はじめは1でした。 1増えて2になりました。 1減って1に戻りました。 $a++ と ++$a の違い インクリメント演算子、デクリメント演算子には2通りの書き方があります。 ++$a(前置)と$a++(後置) --$a(前置)と$a--(後置) 前置の場合は変数の参照より先に演算が行われます。 後置の場合は変数の参照より後に演算が行われます。 $x=$a=1; 変数$xと$aに1を代入する。 $x=++$a; $aに1を足した後に$xに代入する。$xの値は2になる。 $x=$a=1; 変数$xと$aに1を代入する。 $x=$a++; 変数$aの値を$xに代入した後に$aに1を足す。$xの値は1。 文字もインクリメント出来ます。 $x="A"; "A"を$xに代入する。 $x=++$x; Aから一つ増やしてBにして$xに代入する。 $x="aaa"; "aaa"を$xに代入する。 "aaa"を一つ増やして"aab"を$xに代入する。 ただし、文字のデクリメントはできません。

    • ベストアンサー
    • Perl
  • インクリメント演算子の前置(++a)と後置(a++)の違い

    こんにちは、Java初心者です。どなたか質問タイトルの件で教えていただけませんでしょうか。 Javaのテキストで下のようなものがあったのですが、違いがテキストの説明ではよくわかりませんでした。この場合はどう違うのですか?初心者向けに、参照、演算の詳細なタイミングを一つ一つ教えていただけないでしょうか?前置の方が2になるのはなんとなくわかりそうなのですが、後置はさっぱりなのです。。。 int x, a=1; x=++a; ⇒xの値は2 int x, a=1, x=a++1; ⇒xの値は1のまま また、実例としてはどんな場合に前置又は後置を使うのですか? よろしくお願いいたします。

    • ベストアンサー
    • Java
  • javascriptの変数とperlの変数で計算

    初めて質問させていただきます。 javascript計算で困っています n[0] -=$y_p[1][0]; のperlの変数$y_p[1][0]にjavascriptの変数xを代入して計算しようと試みました。 n[0] -= $y_p[x][0]; しかしこれでは上手くいかないようです。 こんな感じのことは出来ないのでしょうか。 よろしくお願いします。

  • なぜ0を代入してはいけないのでしょうか?

    家庭教師をしていて、数学の問題をやっていたときに、教えていた子に 「どうして0を代入してやってはいけないのか?」と聞かれました。 (X+Y)^3+(X-Y)^3=2X^3+6XY^2 が成り立つことを証明せよ という問題だったのですが、本来なら右辺か左辺を変形して、 左辺=右辺の形にする、という答えなんです。 確かにXかYに0を代入すればイコールが成り立つ式ではあるのですが、 どうして0を代入して右辺=左辺の形にしてはいけないのかと聞かれると なんと答えていいか分かりません。 私のこの質問もわかりにくいかと思いますが、お分かりになる方、どうぞよろしくお願いします。

  • 不規則変数の説明

    不規則変数を加算した不規則変数の分散(パワー)は、元の加算回数倍となるため、 確率変数 x を12回加算した新しい不規則変数 y の平均は、6、分散は、1となる。 E[ y ] = 12 E[ x ] = 6、 σy = 1 (σy = 1:標準偏差) こんなのを説明するには、何をポイントに説明したらよいでしょうか 不規則変数っていうのはランダムな変数ということでしょうか? また確率変数を12回加算して、なぜyの平均は6になり分散が1になるのでしょうか?

  • インクリメント演算子について

    インクリメント演算子について プログラミング超初心者です。 大学のプログラミングの課題で インクリメント演算子を使って 数字をひとつずつ大きく(小さく)していくという課題が出ました 私が作ったプログラムは以下のとおりです #include <stdio.h> int main(void) { int x ; //変数宣言 printf("整数値を入力してください:"); scanf("%d",&x); printf("1ずつ増加\n"); printf("%d,",x++); printf("%d,",x++); printf("%d,",x++); printf("%d,",x++); printf("%d\n",x); printf("1ずつ減少\n"); printf("%d,",x--); printf("%d,",x--); printf("%d,",x--); printf("%d,",x--); printf("%d\n",x--); } ちなみに、整数値は10にしました。 結果は 1ずつ増加 10,11,12,13,14 1ずつ減少 14,13,12,11,10 と、望んでるものになったのですが、疑問があるので質問させていただきます。 xを変数にすると、x++はx+1になると思うのですが表示されたのは10、11、…と 10から表示されました。 しかも、増加していった最後のxはなぜ14になるのでしょうか? 課題は出来たのですが、頭が混乱しています… 詳しく解説をお願いします。

  • 線形微分方程式の過程で

    cos x・cos^2 y+y'・sin x・sin y=0の計算過程で 変数分離形として左辺に∫(sin y/cos^2 y)dyが出てくるのですが、 どうもこの積分のやり方がわかりません。 とても拙い質問とは承知してますがお力添えをおねがいいたします。 また、そんなもの出てこないなどありましたらよろしくお願いします。

専門家に質問してみよう