• ベストアンサー

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

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

  • Java
  • 回答数3
  • ありがとう数6

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

  • ベストアンサー
  • com58
  • ベストアンサー率37% (3/8)
回答No.1

単行で使う場合、前置と後置に違いはありません。 例. ++x; y++; この場合、行っていることはどちらも同じです。 前置と後置の違いを簡単に書けば「値を変化させるタイミングが違う」ということです。挙げられた式「x = ++a;」と「x = a++;」という式は、以下のように書き換えることができます。 x = ++a; ↓ x = (a + 1); x = a++; ↓ (x = a) + 1; つまり、インクリメントを行うタイミングが異なることになります。前置の場合は式(ないしメソッド)の評価を行う前にインクリメントを行い、後置の場合は逆に式(ないしメソッド)の評価を行った後インクリメントを行うことになります。 当然、デクリメントでも同じ結果になります。 実例……。うーん。インクリメントの評価タイミングを意識しておけば、全く同じ内容のプログラムでも前置と後置両方で組めるので、最終的には個人の好みになってしまうような……。 for文中で使うのはひとつの例になるのかな。 蛇足ですが、条件式内にインクリメントを組み込むこともできます。そのとき、前置と後置を意識して書かなければ、思わぬバグに遭遇することもありますからご注意ください。 複数条件式をショートサーキット(&&とか||とか)でくくるとその辺のバグに出会いやすいかも。

mstmk1111
質問者

お礼

回答下さいましてありがとうございます。 x=(a+1) (x=a)+1 と考えればいいんですね。一人で難しく考えすぎてしまっていました。おかげですっきりしました。確かにfor文中でよく見かけますね。まだ初めて2日なんですが色々理解できるように頑張ってきます。 ありがとうございました!

その他の回答 (2)

  • nak777r
  • ベストアンサー率36% (49/136)
回答No.3

式を分けて書くと x=++a; ↓ a=a+1; x=a; x=a++; ↓ x=a: a=a+1; こんな感じ ++a は先にaをインクリメント a++ は後でaをインクリメント 実例としては、x=a++; や x=++a;のような 使い方はプログラムの可読性が悪くなるので 初心者は、基本使わない a++; x=a; や x=a; a++; の様に分けて書く 無理して1行にする必要は無いでしょう ただ、他の人のプログラムで使われている 可能性があるので、知識として知っておく必要はある という程度のものと理解しておけば良いかと

mstmk1111
質問者

お礼

回答ありがとうございます。 そうなんですか、2つに分けて考えて書く方法もあるんですね!まずは読めるようになることなのでしっかり理解しておかないとですね。 ありがとうございました!

回答No.2

1) int x, a=1; x=++a; → a=a+1演算後にxにaの値を代入する(この場合xには2が代入される) 実行後 x=2 a=2 2) int x, a=1, x=a++; → xにaの値を代入後a=a+1を演算する(この場合xには1が代入される) 実行後 x=1 a=2 となります。 使い方はケースバイケース。 このへんの話は最も基礎的な部分ですので初心者向けサイトを見たほうがより正確な答えが得られるかと思います。 インクリメント/デクリメント演算子 http://msugai.fc2web.com/java/ope.html

mstmk1111
質問者

お礼

回答下さいましてありがとうございます。 そうですね、教えていただいたサイトと合わせて勉強させていただきます。 ありがとうございました!

関連するQ&A

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

    後置インクリメントの計算過程について 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
  • 前置と後置について

    前置と後置について知りたいことがあります。 コードは下記のようなものを例にします。 いちばん左の数字はコードの数字ではなく、わかりやすいように つけた番号です。ブラウザに表示した場合は (1)=1、(2)=2、(3)=1、(4)=1になりますよね。 (4)についてなのですが、このブラウザ表示以降にコード内で2になるということですか?その辺の解釈の仕方がよくわかりません。ご教授、よろしくお願いします。 (1) print $x = $a = 1; (2) print $x = ++$a; (3) print $x = $a =1; (4) print $x = $a++;

    • 締切済み
    • PHP
  • 後置インクリメントについて質問

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

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

  • インクリメント/デクリメント演算子を使った計算

    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 となることは理解できます。 ご教授のほどよろしくお願いします。

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

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

    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
  • インクリメント/デクリメント演算子を使った計算

    Javaの質問に「インクリメント/デクリメント演算子を使った計算」というのがありました。 int a = 10; int b = a++ + ++a + --a - a--; 普通、こんなことはしないのですが、試しにやってみました。 これは int a = 10; int b = a++; b += ++a; b += --a; b -= a--; と同値だと思うのですが、手元の環境で次の結果となりました。   Java   bcc(C)   bcc(C++)  MinGW(g++) MinGW(gcc) (1) 11 : 10  11 : 10  11 : 10   11 : 10    11 : 10 (2) 12 : 22  12 : 22  12 : 22   12 : 22    12 : 22 (3) 11 : 33  11 : 30  11 : 30   11 : 32    11 : 32 (4) 10 : 22  10 : 20  10 : 20   10 : 22    10 : 22 ここで、各結果は「a : b」の形で (1) b = a++; (2) b = a++ + ++a; (3) b = a++ + ++a + --a; (4) b = a++ + ++a + --a - a--; を出力しています。 ただし、MinGW(gcc)のみoperation on `a' may be undefinedの警告が出ました。 どなたか、原因を教えていただけますか。 環境はWinXP Pro SP3, Java 1.6.0_14, bcc 5.5.1.2 gcc/g++ 3.4.5です。

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

    インクリメント演算子について プログラミング超初心者です。 大学のプログラミングの課題で インクリメント演算子を使って 数字をひとつずつ大きく(小さく)していくという課題が出ました 私が作ったプログラムは以下のとおりです #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になるのでしょうか? 課題は出来たのですが、頭が混乱しています… 詳しく解説をお願いします。

専門家に質問してみよう