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

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

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

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

Q&A

解決済

3回答

1003閲覧

インクリメントについて

DORA0702

総合スコア7

Java

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

0グッド

1クリップ

投稿2021/12/02 22:18

編集2021/12/02 22:19

Java8 silverの資格に向けて勉強しています。
そこで、参考書の解説を読んでもわからないことがありました。

int num = 10; do { num++; }while (++num < 10); System.out.println(num);

このコードを解説で、
『設問のコードは、int 型変数numを宣言し、10で初期化しています。
その後、doブロック内でインクリメントされて、値は11になります。続いて条件式の判定をする際に、まず前置インクリメントによってnumの値が12に変更されてから「10よりも小さいか」という判定をしています。』
という説明がありました。

私の解釈では、
①doブロック内インクリメントされる。(後置インクリメントで一回目の繰り返しなのでnumの値は10)
②条件式の前置インクリメントによってnumの値が11に変更されてから「10よりも小さいか」という判定される。
③11が画面に出力される。
となると思いました。

どうして、解説のようになるのか教えてほしいです。

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

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

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

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

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

guest

回答3

0

ベストアンサー

①doブロック内インクリメントされる。(後置インクリメントで一回目の繰り返しなのでnumの値は10)

いえ、インクリメントされて11です。

投稿2021/12/02 22:25

maisumakun

総合スコア145262

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

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

maisumakun

2021/12/02 22:27

後置インクリメントの「足す前の値」というのは、たとえばFoo.bar(a++)やb = a++のように、インクリメント自体を別の演算に使った場合の話です。次の行に進めば足されて11です。
DORA0702

2021/12/02 22:35

そうだったんですね。そのように場合分けされているなんて知らなかったです。 ありがとうございます。資格勉強がんばります。
guest

0

場合分けというコメントから、勘違いされていないか気になったので、念のため補足説明させて頂きます。

int num = 10; int b = 0; b = num++;

の場合では、 numがインクリメントされる前の値である"10"がbに代入されるので、

do { num++; }while (++num < 10);

でインクリメントされる前のnumの状態がwhile()条件式に渡される
とお考えになったのかと思います。

しかし do {} while()文はあくまで do{}の{}内の処理を完了させてから、while()の()内を評価します。

そして、num++;は、ご存知のように
(処理1) それ自体(num++)はインクリメント前のnumの値を表す
(処理2) numの値を1増やす
という2つの処理がされます。

今回do{num++;} の処理では、
b=num++のように何かに代入されるわけでもなく、
oo.bar(num++)のようにインクリメント前のnumの値がbar()メソッドの引数に渡されるわけでもありません。
そのため(処理1)としては実質何もしていません。
(あくまでイメージですが)単に 10; と記述されているようなものです。
しかし(処理2)は行われるのでnumの値は11になります。

以上がdo{}の処理です。
その後で、while()の()内を評価します。
numが11になっている状態で while{ ++num < 10} が評価されるので、解説の通りになります。

前置インクリメントだからといって、インクリメントされていない状態でwhile()の評価式が行われるわけではない
あくまでdo{}while()だから上記のような処理の流れになるのであって、
num++がケースバイケースで違う挙動をしているわけではない、ということは理解しておく必要があります。

投稿2021/12/03 04:08

Crimson_Tide

総合スコア509

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

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

DORA0702

2021/12/05 17:30

とてもわかりやすい回答ありがとうございます。 インクリメントで具体的にどのような処理がされているのかよくわかっていなかったのでとても助かりました。
guest

0

後置インクリメント、前置インクリメント、の違いを調べてみればいいかと。
どちらも実行すれば+1されますよ

投稿2021/12/03 00:08

y_waiwai

総合スコア87804

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.45%

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

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

質問する

関連した質問