みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

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

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
となることは理解できます。

ご教授のほどよろしくお願いします。

投稿日時 - 2009-07-29 22:21:05

QNo.5166349

すぐに回答ほしいです

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.3

インクリメンタル演算子は演算子(今回は+と-)の評価前と後は
理解されていると思います。

コンバイラは演算処理時に
変数を以下のような値で解釈しているように思います
int b = a++ + ++a + --a - a--;
// 10 + 12 + 11 - 11

結果22でしょうか?
机上デバッグなため 不確かですので
実行させて確認してください

間違っていたらごめんなさい


あまり この問題にこだわらなくても
他で点数取ればよいのではないでしょうか

まじめな性格なんですよね
気楽に点数取れるところで、稼いでください
がんばって

投稿日時 - 2009-07-31 22:40:51

ANo.2

これは、何かの問題ですか?
こういった問題に頭を使うのは、暇つぶし以外の意味は全くありません。

数字パズルをいくらといても、数学的センスが身に付くわけではないのと
同様に、こんな問題を解くこととプログラミングの能力とは、
何の関係もありません。


パズルのような問題ならいくらでも複雑なものが制作できます。

 int a = 2;
 int b = a++ + (b=++a)*b;

こんな単純な計算式でも、多くの人の予想を裏切る結果が出ます。
要は、インクリメント演算子は無闇に使ってはいけないということです。

暇で仕方が無いから考えてみたいというなら、これ以上忠告はしませんが...

投稿日時 - 2009-07-30 11:11:01

補足

>HarukaV49さん

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

まさか、自分で暇つぶしでこんなことやりませんよ。

投稿日時 - 2009-07-30 22:33:26

ANo.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)となります。

投稿日時 - 2009-07-30 00:10:29

あなたにオススメの質問