後置インクリメントの計算過程について

このQ&Aのポイント
  • Javaの後置インクリメントについての質問です。変数xを使用した式の計算結果について教えてください。
  • x = 10; y = x++ + x++; の計算結果はy = 21となります。
  • 後置インクリメントは、まず計算に使用した後に変数の値を1増やすため、x++ + x++ ではxの値が両方とも10のまま計算されます。
回答を見る
  • ベストアンサー

後置インクリメントの計算過程について

後置インクリメントの計算過程について 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
  • 回答数3
  • ありがとう数2

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

  • ベストアンサー
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

x = 10; y = x++ + x++; をきちんと処理すると y = x++ + x++; → y = 10 (この時点で x は 11) + x++; → y = 10 + 11 (この時点で x は 12); → y = 10 + 11 = 21 となります. この文のあと x は 12 です. 逆に y = ++x + ++x; だと y = 11 (この時点で x は 11) + ++x; → y = 11 + 12 (この時点で x は 12); → y = 11 + 12 = 23 です. この場合でも x は 12 です. と, しっかりおいかけるとその 4つのうち 2つ目は 3つ目と等しいけど 1つ目, 2つ目 (これは 3つ目と同じ), 4つ目は全て異なることもわかるはず.

oluoluHW
質問者

補足

なるほど! y = x++ + ++x + ++x の場合は、 y=10 + ++x + ++x (この時点でx=11) y=10 + 12 + ++x (この時点でx=12) y=10+12+13 (この時点でx=13) y=35 y = x++ + ++x + x++ の場合は、 y=10 + ++x + x++ (この時点でx=11) y=10 + 12 + x++ (この時点でx=12) y=10+12+12 (この時点でx=13) y=34 y = x++ + x++ + ++x の場合は、 y=10 + x++ + ++x (この時点でx=11) y=10 + 11 + ++x (この時点でx=12) y=10+11+13 (この時点でx=13) y=34 y = x++ + x++ + x++ の場合は、 y=10 + ++x + ++x (この時点でx=11) y=10 + 11 + ++x (この時点でx=12) y=10+11+12 (この時点でx=13) y=33 いずれの場合もx=13 あってますでしょうか?

その他の回答 (2)

  • SaKaKashi
  • ベストアンサー率24% (755/3136)
回答No.2

import java.lang.*; public class Op { public static void main(String argv[]) { int x = 10 ; int y = 0 ; int i = 0 ; for ( i = 0 ; i < 5 ; i++ ) { System.out.println("x="+x+" y="+y); y=x++ + x++ ; } } } x=10 y=0 x=12 y=21 x=14 y=25 x=16 y=29 x=18 y=33

  • zionic
  • ベストアンサー率39% (31/79)
回答No.1

y = 10 + 11になります。 計算に使用したあと、ではなく計算途中でもインクリメントはされてます。 自分の場合、ソース上でxの値を認識したらインクリメントされてる、というふうに考えてます。 最初のxを「10」と認識した後にインクリメントされて、2番目のxは「11」となっているんだな、だから展開すると、y=10+11で答えは21になるんだなって感じです。 説明になってるかなぁ。

oluoluHW
質問者

補足

早速のご回答ありがとうございます。 多分わかったと思います。。。 ちなみに int x, y; y = x++ + x++ + x++; の場合は、y=10+11+12 で y=33 y = ++x + ++x + ++x; の場合は、y=11+12+13 で y=36 あってますでしょうか? もしこれが正しいとすると、2項目以降の変数xは前置でも後置でも同じ結果にならないでしょうか? 具体的には y = x++ + ++x + ++x y = x++ + ++x + x++ y = x++ + x++ + ++x y = x++ + ++x + ++x は全て同じ結果になりませんか?

関連するQ&A

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

    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
  • 後置インクリメントについて質問

    以下の式は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
  • 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
  • インクリメントについて

    インクリメントについて C言語のプログラム中に(1)の文(前置演算子)が存在するのですが、(2)の文(後置演算子)に置き換えても構いませんか? if(a) ++a; ・・・(1) if(a) a++; ・・・(2) 教授下さい。 よろしくお願い致します。

  • インクリメント演算子の前置(++a)と後置(a++)の違い

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

    • ベストアンサー
    • Java
  • インクリメント/デクリメント演算子を使った計算

    Javaでのインクリメント演算子とデクリメント演算子を 使った計算についての質問です。 int a = 10; int b = a++ + ++a + --a - a--; このコード処理後の変数a,bの値の計算方法(考え方)が つかめず苦戦しています。 解答はa=10,b=22だそうです。 ちなみに例えば次のコードのb=a++;のように 右辺と左辺が1つずつの場合は理解しやすいです。 int a = 1; int b = 0; b = a++; //処理A 処理A後の変数a,bの値は b=aをした後でa=a+1を行うので a=2,b=1 となることは理解できます。 ご教授のほどよろしくお願いします。

  • 計算過程

    ☆x^2+7y^2+4xy+2x-8y+20=★(x+2y+1)^2+3(y-2)^2+7   ☆からどのように計算したら★になるのか計算過程を詳しく教えてください。

  • 後置インクリメントの挙動が不明で困ってます

     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
  • インクリメント、デクリメントの順序について

    式中にインクリメント、デクリメントがある場合、制御の順番はちゃんと定義されていないようですが ・これは、一度コンパイルされてしまったら、もう動作はその時置き換えられた形で固定される。 ・同じコンパイラ、同じ環境で、同条件でコンパイルした場合は、まず間違いなく同じ結果が得られる。 ・ただし、その順序はコンパイラ毎に違う可能性がある。 という事で正しいですか?

  • 計算の過程を噛み砕いて教えてください。

    計算の過程を噛み砕いて教えてください。 (2x-6)^2+(2y+4)^2=2 ↓ (x-3)^2+(y+2)^2=1/2 です。 高校2年の軌跡の問題の途中です。 よろしくお願いします!

専門家に質問してみよう