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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

9回答

1455閲覧

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

jijit

総合スコア26

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2019/01/18 01:41

// 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減らすのはわかっています。

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2019/01/18 01:49

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

回答9

0

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

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

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

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

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

#追記

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

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

Java

1// num1~4は、いずれも1 2int num1 = 1; 3int num2 = 1; 4int num3 = 1; 5int num4 = 1; 6 7// out.print(++num1); // +1されてから、print 8num1 = num1 + 1; 9out.print(num1); // この命令により 2 が表示される 10 11// out.print(num2++); // printしてから+1 12out.print(num2); // この命令により 1 が表示される 13num2 = num2 + 1; 14 15// out.print(--num3); // -1してから、print 16num3 = num3 - 1; 17out.print(num3); // この命令により 0 が表示される 18 19// out.print(num4--); // printしてから-1 20out.print(num4); // この命令により 1 が表示される 21num4 = num4 -1;

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

投稿2019/01/18 01:48

編集2019/01/18 02:53
otn

総合スコア84505

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jijit

2019/01/18 01:52

--は値を1減らすのだからー1になるのではないですか?? おしえてください。どういう計算式になるのですか?
jijit

2019/01/18 02:26

はい、そのコメントが一番しっくりきます。 全然理解できませんがこのコードを参考に考えます。ありがとうございます!
dit.

2019/01/18 02:37

https://teratail.com/questions/169348 こちらの質問でも「演算」と「出力」の区別がつかないことで混乱しているような印象を受けました。 「頭の中で計算するだけ」と、「その結果を紙などに書く」ことの違いだと思ってください。 その書き出すタイミングが違うのです。
otn

2019/01/18 02:54

さらに補足しました。
m.ts10806

2019/01/18 04:04

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

2019/01/19 08:49

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

0

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)
上記で実行してみてください。

投稿2019/01/18 01:50

reraNine

総合スコア124

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

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

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する前の値が式の結果になります。

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

投稿2019/01/18 07:17

daisuke7

総合スコア1563

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

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

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

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

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

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

投稿2019/01/18 02:19

mather

総合スコア6753

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

out.print(++num1); // +1されてから、print

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

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

Java

1num1 += 1; 2out.print(num1); //出力結果2 3 4out.print(num2); //出力結果1 5num2 += 1; 6 7num3 -= 1; 8out.print(num3); //出力結果0 9 10out.print(num4); //出力結果1 11num4 -= 1;

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

投稿2019/01/18 01:54

編集2019/01/18 02:07
azuapricot

総合スコア2341

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2019/01/18 02:03

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

2019/01/18 02:06

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

2019/01/18 02:38

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

0

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

投稿2019/01/18 01:45

maisumakun

総合スコア145183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jijit

2019/01/18 01:49

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

2019/01/18 01:51 編集

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

0

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

ご自身で考えたのか, 一つの方法として ++/-- を +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/20 17:17

編集2019/01/20 17:22
jimbe

総合スコア12634

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jimbe

2019/01/26 16:58

'分からない'ということはどういうことかを改めて考えさせられます. 自分の回答を書いてからも考えていましたが, どうも気になったのが maisumakun さんの回答へのコメント 「printしてからということは1+1=2になるのではないですか?」 この言葉の意味することは何だろう... print で表示することも 1足されることも分かっていて, 結果が違うというのは... 表示は続いている, という感覚でしょうか. 例えば '街角の気温の電光掲示板' のように, print(num) とすると num の値をずっと一点に表示し続けるイメージでしょうか. java 的に言えば, print(num) と宣言すると num のリスナが生成されて, 画面のカーソル位置に TextField があって num が変わるとその TextField の表示も変わるという... ^^; GUI から入っていて, タイプライタ的な動きのイメージが無いと, 案外こんなこともあるのかも...知れません.
jimbe

2019/01/26 17:16

だとしたらこの問題(?)は二つに分かれていて, 一つは, ++/-- を四則演算で理解しようとしたこと. もう一つは, out.print() を "括弧の中の変数を表示し(続け)ろ" という宣言のような感覚でいること. でしょうか. 「printしてからということは1+1=2になるのではないですか?」 は 『num を print しろと宣言した後だから, 1+1 で 2 になったら, "2" と print するのではないか?』 という表現だったとすると, しっくり来ます.
guest

0

  • インクリメント・デクリメントの前置と後置の使い方

https://eng-entrance.com/java-cal-position

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

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

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

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

投稿2019/01/19 03:47

katoy

総合スコア22324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

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

と言っておきながら

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

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

投稿2019/01/18 04:16

swordone

総合スコア20651

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

azuapricot

2019/01/18 04:21

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

2019/01/18 04:49

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

2019/01/18 04:49

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

2019/01/20 18:04

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問