質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.11%

四則演算の++、--について

受付中

回答 9

投稿

  • 評価
  • クリップ 0
  • VIEW 1,099

score 10

// num1~4は、いずれも1
int num1 = 1;
int num2 = 1;
int num3 = 1;
int num4 = 1;

out.print(++num1); // +1されてから、print
out.print(num2++); // printしてから+1
out.print(--num3); // -1してから、print
out.print(num4--); // printしてから-1

%>


の結果、2101になりました。

最初の計算は、num1の1+1で2になるのは理解できます。

が、2番目はnum2の1+1で2になると思うのです。
3番目は、-1+1で0
4番目はnum4の1-(-1)で2になると思います。

++は値を1増やし、--は値を1減らすのはわかっています。

どういう計算になるのか教えてください。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • m.ts10806

    2019/01/18 10:49

    コメントは自分で書いたわけではなかったのでしょうか。

    キャンセル

回答 9

+10

プログラム中のコメントに書いてある通りですね。

2番目はnum2の1+1で2になると思うのです。

の間違いは想像できますが、

3番目は、-1+1で0
4番目はnum4の1-(-1)で2になると思います。 

は、どこから -1 を発想したのか不思議です。

追記

おしえてください。どういう計算式になるのですか?

こういう計算式です。コメントをコードにしただけですが。

// num1~4は、いずれも1
int num1 = 1;
int num2 = 1;
int num3 = 1;
int num4 = 1;

// out.print(++num1); // +1されてから、print
num1 = num1 + 1;
out.print(num1); // この命令により 2 が表示される

// out.print(num2++); // printしてから+1
out.print(num2); // この命令により 1 が表示される
num2 = num2 + 1;

// out.print(--num3); // -1してから、print
num3 = num3 - 1;
out.print(num3); // この命令により 0 が表示される

// out.print(num4--); // printしてから-1
out.print(num4); // この命令により 1 が表示される
num4 = num4 -1;

おそらく、「演算結果」と「(画面)出力」の区別が付いていないんだと思います。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/01/18 11:54

    さらに補足しました。

    キャンセル

  • 2019/01/18 13:04

    > 全然理解できませんがこのコードを参考に考えます

    理解できていないのに考えることはできません。
    というか概念とか仕様とかの話なので、考えるのではなく「そういうものだ」という理解をしてください。
    あとは数字なり式なりを変えてみて実行結果を確認して身につけてください。

    キャンセル

  • 2019/01/19 17:49

    変数 = 式; という命令を実行しただけでは何も出力(表示)されません。
    printして初めて出力(表示)されます。

    キャンセル

+8

out.print(++num1); // +1されてから、print
out.print(num1)
out.print(num2++); // printしてから+1
out.print(num2)
out.print(--num3); // -1してから、print
out.print(num3)
out.print(num4--); // printしてから-1
out.print(num4)
上記で実行してみてください。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+3

コメントに「printしてから+1」とあるとおりで、printnum2(1)を渡したあとで1を足しています。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/01/18 10:49

    printしてからということは1+1=2になるのではないですか?
    理解できません( ノД`)シクシク…

    キャンセル

  • 2019/01/18 10:50 編集

    printの処理が終わったあとに1を足すので、printで出力されるのは足す前の値です。

    キャンセル

+3

out.print(++num1); // +1されてから、print 
out.print(num2++); // printしてから+1 
out.print(--num3); // -1してから、print 
out.print(num4--); // printしてから-1 

分かりやすく?書くなら以下でしょうかねぇ。

num1 += 1;
out.print(num1); //出力結果2

out.print(num2); //出力結果1
num2 += 1;

num3 -= 1;
out.print(num3); //出力結果0

out.print(num4); //出力結果1
num4 -= 1;

++num と num++ で結果が同じになってしまうなら 2つで記述を分ける必要がなくなってしまいますよね。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/01/18 11:03

    単なる+や=では値が捨てられるだけになるので、+=や-=でないといけないかと思います。

    キャンセル

  • 2019/01/18 11:06

    わかりやすく書きすぎましたね()直します。

    キャンセル

  • 2019/01/18 11:38

    この人がjspの質問してたのか~・・・。
    やっぱりJavaに関してド素人だったんですね・・・。
    がんばれ~。

    キャンセル

+3

正確に言うならこれは四則演算ではなくインクリメントです。前置と後置で返り値に違いがあります。

++a : a をインクリメントして、インクリメントした値を返す。
a++ : a をインクリメントして、インクリメントする前の値を返す。

したがって、 print(num2++) については次のように解釈されるはずです。( System.out. などは省略)

print(num2++);
↓
print(1); // num2 == 2

これは「 print してから a をインクリメントする」のではなく、 a++ を評価したときに返す値が「もともと a だった値」なのです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+3

まず言語仕様を学びましょう。できれば言語仕様そのものを読む、難しいなら教科書で学びましょう。

15.15. Unary Operators
15.14. Postfix Expressions

公式邦訳は見つけられませんでしたが、訳されている方がいらっしゃったので感謝して、、

15.15 単項演算子
15.14 後置式

重要なのは、++も--も、「式」だと言うことです。
式には結果があります。どういう結果になるかが上記の仕様に書かれています。

(邦訳:15.15.1 前置増分演算子 ++ より引用)

その前置増分式の値は,その新しい値が記憶された後の変数の値とする。

(邦訳:15.14.1 後置増分演算子 ++ より引用)

その後置増分式の値は,その新しい値が記憶される前の変数の値とする。

式ですから評価後は結果があります。
そして記述の通り、前置(++n, --n)か後置(n++, n--)かでその結果の仕様が違います。

前置(++n, --n)の場合の結果は「新しい値が記憶された後の変数の値」、つまり+1あるいは-1した後の値が式の結果になるので理解しやすいのですが、後置(n++, n--)の場合の結果は「新しい値が記憶される前の変数の値」、つまり+1あるいは-1する前の値が式の結果になります。

この違いが理解できない、あるいは考えるのめんどくさい、ということなら、++/--使うのやめちゃうのも手だと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+2

興味深いスレッドになっていますね.
学生さんが教科書か先生が書かれた ++,-- のコードを理解しようと四苦八苦しているようです.

ご自身で考えたのか, 一つの方法として ++/-- を +1/-1 と文字レベルで置き換えて, ++num を (+1)num, --num を (-1)num 等とし, 間に(数学で'×'を省略するような感じで)'+'が省略されているとして計算すれば良いのではないかとしましたが, 結果と合わなかった...というところでしょうか.

実際, ++/-- は理解するモノでは無く「こういう結果になるモノ」と覚えるしかない類です.
1増やす/1減らす というのは間違っていませんが, 全てを表してはいません. それは数学には基本無いはずの「計算されるタイミング」です. (乗除を加減より先に...というのともちょっと違います.)

プログラムは順番に実行されます. 一行に書かれたプログラムでも, コンピュータの内部では特定の順番に従って実行され, 計算も同様です.

out.print() は括弧の中の値を表示するモノなので, 当然括弧の中が先に計算されます. が, ++/-- はその「計算(=変数の値が変更)されるタイミング」に干渉します.
変数の前に ++/-- を書いた場合は先に計算される(普通の)タイミングですが, 後ろに書いた場合は out.print() が先に実行され, その後に計算(変数の値が変更)されるのです. ++/-- の付いている部分が括弧の後ろまで飛び出して, out.print(num++); が out.print(num); num++; となってしまうような感じでしょうか.
「飛び出したら out.print(); num++; じゃないの?」と思われるでしょうけれど, ++/-- は変数部分は残すのです.

こういった, 傍目にはなんのためにあるのかサッパリ分からないようなモノなので, 実際使わなくてもプログラムは作れます. 端的には, "num=num+1" と書くよりも "num++" と書いたほうが4文字短いからとか格好良いからとかいうレベルの話です.
(超内部的に言えば, CPUには昔から1を足す/1を引くという専用命令があったため, 汎用足し算命令よりも専用命令になり易いように ++/-- が...というコトもありましたが, 後置の専用命令は無かったような^^; )

ほぼ, 他の方々が説明してくださっていることを言葉を変えてみただけですが, ご理解の助けになれば幸いです.

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/01/27 01:58

    '分からない'ということはどういうことかを改めて考えさせられます.
    自分の回答を書いてからも考えていましたが, どうも気になったのが maisumakun さんの回答へのコメント
    「printしてからということは1+1=2になるのではないですか?」

    この言葉の意味することは何だろう... print で表示することも 1足されることも分かっていて, 結果が違うというのは...
    表示は続いている, という感覚でしょうか.
    例えば '街角の気温の電光掲示板' のように, print(num) とすると num の値をずっと一点に表示し続けるイメージでしょうか.
    java 的に言えば, print(num) と宣言すると num のリスナが生成されて, 画面のカーソル位置に TextField があって num が変わるとその TextField の表示も変わるという... ^^;

    GUI から入っていて, タイプライタ的な動きのイメージが無いと, 案外こんなこともあるのかも...知れません.

    キャンセル

  • 2019/01/27 02:16

    だとしたらこの問題(?)は二つに分かれていて,
    一つは, ++/-- を四則演算で理解しようとしたこと.
    もう一つは, out.print() を "括弧の中の変数を表示し(続け)ろ" という宣言のような感覚でいること.
    でしょうか.

    「printしてからということは1+1=2になるのではないですか?」

    『num を print しろと宣言した後だから, 1+1 で 2 になったら, "2" と print するのではないか?』
    という表現だったとすると, しっくり来ます.

    キャンセル

0

++は値を1増やし、--は値を1減らすのはわかっています。

と言っておきながら

4番目はnum4の1-(-1)で2になると思います。

というのは矛盾してると思いませんか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/01/18 13:21

    そこまで細かくみていませんでしたが確かに~・・・

    キャンセル

  • 2019/01/18 13:49

    そうか、1から1を引くから0になるんですね!!

    キャンセル

  • 2019/01/18 13:49

    いや、答えは1になるはずなんです。

    キャンセル

  • 2019/01/21 03:04

    あなたの思考がごちゃごちゃしているので、落ち着いて読み返してみてください。
    otnさんの言う通り、コメント通りの動作をしているわけですし、
    daisuke7さんの言う通り、インクリメントやデクリメントが「何らかの結果を返す"式"である」という認識に立てば何ら不思議のない話だと思うのですが。

    キャンセル

0

...
オペランドの前にあれば、式の中でオペランドの値は増やされたり減らされたりした後の値が用いられる。
一方、オペランドの右にあれば、式の中でオペランドの値は増やされたり減らされたりする前の値が用いられる。
...

print(a) は a という式の値を表示します。(四則演算をしていない変数だけでも 式とみなします)

++a や a-- も式です。

++a は a に +1 をして その結果が式の値になります。
a++ も a に +1 をしますが、式の値は +1 する前の値になります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.11%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る