• 締切済み

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

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

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

みんなの回答

  • tty911
  • ベストアンサー率0% (0/2)
回答No.3

インクリメンタル演算子は演算子(今回は+と-)の評価前と後は 理解されていると思います。 コンバイラは演算処理時に 変数を以下のような値で解釈しているように思います int b = a++ + ++a + --a - a--; // 10 + 12 + 11 - 11 結果22でしょうか? 机上デバッグなため 不確かですので 実行させて確認してください 間違っていたらごめんなさい あまり この問題にこだわらなくても 他で点数取ればよいのではないでしょうか まじめな性格なんですよね 気楽に点数取れるところで、稼いでください がんばって

  • HarukaV49
  • ベストアンサー率53% (48/89)
回答No.2

これは、何かの問題ですか? こういった問題に頭を使うのは、暇つぶし以外の意味は全くありません。 数字パズルをいくらといても、数学的センスが身に付くわけではないのと 同様に、こんな問題を解くこととプログラミングの能力とは、 何の関係もありません。 パズルのような問題ならいくらでも複雑なものが制作できます。  int a = 2;  int b = a++ + (b=++a)*b; こんな単純な計算式でも、多くの人の予想を裏切る結果が出ます。 要は、インクリメント演算子は無闇に使ってはいけないということです。 暇で仕方が無いから考えてみたいというなら、これ以上忠告はしませんが...

tastykk
質問者

補足

>HarukaV49さん これはある高等技術専門学校のJAVAプログラミング科で 実際に講義であった問題です。 SJC-A試験対策と、前置後置インクリメント/デクリメントおよび 演算子の優先順位を理解しているかを問う問題だそうです。 まさか、自分で暇つぶしでこんなことやりませんよ。

  • x_jouet_x
  • ベストアンサー率68% (162/236)
回答No.1

++aのように前置されると式の演算が行われる前にインクリメントを行います。 逆にa++のように後置されると式の演算が終了してからインクリメントを行います。 デクリメントについても同様です。 まずは簡単な例から… int x = 100; int y = 10; のとき int z = ++x * y; は、「*の演算を行う前にインクリメントを行う」ので z = 101 * 10 = 1010 になります。 int z = x++ * y; は、「*の演算を行った後にインクリメントを行う」ので z = 100 * 10 = 1000 になります。 どちらの場合も演算が終わるときにはxはインクリメントされているので、x = 101 になります。 ちなみに質問にある演算、int b = a++ + ++a + --a - a--; ですが、いきなり一気に考えると難しいので1つずつ演算を増やして考えてみましょう。 [a++ + ++aの部分] a++は+演算が行われる時点ではインクリメントされませんので10のままです。ただし+演算子以降に処理が進むときにインクリメントされ11になります。 ++aはこの時点でa=11なので++aは12となり、これで+演算が行われます。 つまり、a++ + ++aの演算は10+12=22(この時点でa=12)となります。 [a++ + ++a + --aの部分] a++ + ++aの部分は上記の通りです。 2つ目の+演算が行われる時点でa=12なので--aは11となり、これで+演算が行われます。 つまり、a++ + ++a + --aの演算は22+11=33(この時点でa=11)となります。 [a++ + ++a + --a - a--の演算] a++ + ++a + --aの部分は上記の通りです。 最後の-演算が行われる時点でa=11ですが、a--は-演算が行われる時点でデクリメントされませんので11のままです。ただし-演算が行われた後にデクリメントされ10になります。 つまり、a++ + ++a + --a - a--の演算は33-11=22(この時点でa=10)となります。

関連するQ&A

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

    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です。

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

    後置インクリメントの計算過程について 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
  • 文字を整数として扱う場合の演算について質問

    javaの参考書に、文字を整数として扱う場合の演算についての解説があり、疑問点があったので質問します。 質問1:何故char型の変数は、キャストしなくてもint型のリテラルを代入することができるのか?      例えば、 以下の演算はキャストしなくてもこのまま代入できます。 char ch='a'; ch=98; でも、以下の演算はキャストしていないのでエラーになります。      char ch='a'; ch=ch+1; これは何故ですか?参考書に記載されていた理由として、「byte,char,short、 これ等の型の変数や値を使って計算すると、それ等は一度intに直して計算されるから」というような趣旨の事が書いてありました。 つまり、char型の変数には、キャストしない限りint型の数値を代入できないということですよね? でも前者のソースコードは、chはchar型であるにもかかわらず、int型のリテラル98を代入できています。 これは何故ですか? 質問2:javaの参考書に、インクリメント・デクリメント演算子と複合代入演算子は、型を保存するという解説がありました。これはどういう意味ですか? 僕の仮説では、例えば、      char ch='a';      ch+=5; であれば、5は、char型のまま代入されるということでしょうか?

    • ベストアンサー
    • Java
  • インクリメント演算子

    はじめまして。プログラミングについて、とても初歩的な所で つまづいています。 変数を一つだけかつ、インクリメント演算子のみを用いて 整数値を一つ入力し,その整数値を1ずつ増やした結果を出す 4,5,6,7,8  (←このようにしたい) というプログラミングを書きたいのですが、どこのサイトを見ても 5個の文字の例はありませんでした。 2個までは以下の例でできました。 #include <stdio.h> main() { int a; printf("整数値を入力"); scanf("%d",&a); printf("1ずつ増加%d,%d,\n",a++,a); } もう、この問題で何日も立ち止まっています。 お願いです、どなたか助けてください。

  • 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
  • インクリメント演算子の前後

    インクリメント演算子(++や--)について伺いたいのですが、 以下のような場合、変数の前と後ろで何か処理上違いはあるのでしょうか? //文字列の最後までポインタを進める while ( *p1 ) { ++p1; } printf("%d" , *p++); のように(文法が間違っていたらすいません)、 出力した後でインクリメントするといった使い方の違いは分かるのですが、インクリメント単独処理での前後の違いがあれば教えていただきたいです。

  • インクリメント++の計算

    インクリメントの前置きと後置きの計算の考え方がいまいち飲み込めないですが 例:int a=5 , w; w=++a + a++;   printf("w=%d. a=%d",w,a); このときのwの値とaの値は? (一応試してみたらw=12 a=7になりましたがなぜでしょう?)

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

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

  • 前置き・後置きインクリメント。

    いつも大変お世話になり誠にありがとうございます。 標記の件。 参考書を見て、考えましたがピンときません。 どなたか解りやすく説明してもらいませんでしょうか? 2種類のコードと実行は下記の通りです. test1.c #include <stdio.h> int main(void) { int a = 0; int b = 0; b = a++; printf("代入後にインクリメントしたのでbの値は%dです。\n", b); return 0; } C:\MinGW>gcc test1.c -o test1 C:\MinGW>test1.exe 代入後にインクリメントしたのでbの値は0です。 test2.c #include <stdio.h> int main(void) { int a = 0; int b = 0; b = ++a; printf("代入前にインクリメントしたのでbの値は%dです。\n", b); return 0; } C:\MinGW>gcc test2.c -o test2 C:\MinGW>test2.exe 代入前にインクリメントしたのでbの値は1です。 前置き・後置きインクリメントの違いを論理的に ご説明願えませんでしょうか。 ご回答の程宜しくお願い申し上げます。

  • ビット演算について

    プログラムを実行した結果が、 10101010 × 11001100 = 10011001 (=の右辺は、演算方法として×の左辺と右辺のNOT XOR、演算処理は1行で行う。) と表示できるプログラムを作成したいのですがよくわかりません。 どなたか教えていただけないでしょうか?よろしくお願いします。

専門家に質問してみよう