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
となることは理解できます。
ご教授のほどよろしくお願いします。
A 回答 (3件)
- 最新から表示
- 回答順に表示
No.3
- 回答日時:
インクリメンタル演算子は演算子(今回は+と-)の評価前と後は
理解されていると思います。
コンバイラは演算処理時に
変数を以下のような値で解釈しているように思います
int b = a++ + ++a + --a - a--;
// 10 + 12 + 11 - 11
結果22でしょうか?
机上デバッグなため 不確かですので
実行させて確認してください
間違っていたらごめんなさい
あまり この問題にこだわらなくても
他で点数取ればよいのではないでしょうか
まじめな性格なんですよね
気楽に点数取れるところで、稼いでください
がんばって
No.2
- 回答日時:
これは、何かの問題ですか?
こういった問題に頭を使うのは、暇つぶし以外の意味は全くありません。
数字パズルをいくらといても、数学的センスが身に付くわけではないのと
同様に、こんな問題を解くこととプログラミングの能力とは、
何の関係もありません。
パズルのような問題ならいくらでも複雑なものが制作できます。
int a = 2;
int b = a++ + (b=++a)*b;
こんな単純な計算式でも、多くの人の予想を裏切る結果が出ます。
要は、インクリメント演算子は無闇に使ってはいけないということです。
暇で仕方が無いから考えてみたいというなら、これ以上忠告はしませんが...
この回答への補足
>HarukaV49さん
これはある高等技術専門学校のJAVAプログラミング科で
実際に講義であった問題です。
SJC-A試験対策と、前置後置インクリメント/デクリメントおよび
演算子の優先順位を理解しているかを問う問題だそうです。
まさか、自分で暇つぶしでこんなことやりませんよ。
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が見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ダブルクォーテーションを含む...
-
PSQLExceptionが発生する
-
wsprintf関数の使い方について
-
char型での演算子
-
Stringクラスの変数の格納アド...
-
DateTimePickerに値を入れたい...
-
特定の文字列を複数抜き出した...
-
【struts】<logic:iterate>で出...
-
暗号化文字列を英数字のみにしたい
-
レジストリの値の取得のデータ...
-
JavaScript→HTMLへ値渡しする方法
-
偶数ビットだけと奇数ビットだ...
-
JavaScript値呼び出しと参照呼出し
-
Formの値が変更されたかどうか...
-
javaの演算子の部分ですが 4行...
-
8桁整数を限りなく短い文字列に...
-
C言語の変数(LSB)の合わせ込...
-
ResultSetの内部構造(Java)
-
javaのCSVデータ読込についてです
-
java nビット目を読み取る
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ダブルクォーテーションを含む...
-
wsprintf関数の使い方について
-
javaのCSVデータ読込についてです
-
ArrayListの要素数の上限
-
BCD形式で時刻を!
-
DateTimePickerに値を入れたい...
-
excel vba 時間計算と条件分岐...
-
日付や時刻の"01"を" 1"に変換...
-
Stringクラスの変数の格納アド...
-
C言語の変数(LSB)の合わせ込...
-
Evaluate()に文字列の形式の数...
-
char型での演算子
-
実行シェルからCOBOLへパラメー...
-
DOSバッチで変数の値を変数名に...
-
レジストリの値の取得のデータ...
-
hiddenの値を消したくない!
-
結合した文字列をファイル名に...
-
ResultSetの内部構造(Java)
-
String型の値が大文字か小文字...
-
javaの演算子の部分ですが 4行...
おすすめ情報