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

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

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

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

Q&A

5回答

611閲覧

for文の実行結果について質問があります

max-777

総合スコア17

Java

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

0グッド

0クリップ

投稿2020/08/20 03:19

java

1コード 2```public class Main { 3 public static void main(String[] args) { 4 int num=1; 5 for(num=0; num<3; ++num){ 6 num*=2; 7 } 8 System.out.println("num="+(num++)); 9 10 } 11} 12 13上記のコードを実行したところ、num=3になりました。最初はint num=1と宣言されており、num*=2とあり、最後に、num++となっているから、num=3であると認識していました。しかしながら、最後のnum++をnumにしても実行結果は同じでした。加えて、解答を見たところ、以下のような感じでした。 14繰り返し1回目 15カウンタ変数num:初期化→0 16条件判定:num<3true 175行目の実行結果:num→0 18 19繰り返し2回目 20カウンタ変数num:++num→1 21条件判定:num<3true 225行目の実行結果:num変数→2 23 24繰り返し3回目 25カウンタ変数num:++num→3 26条件判定:num<3false 27for文が終了 28 29解答の繰り返しの構造も理解できず、スタックしている状況です。誰か教えていただけると幸いです。

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

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

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

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

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

m.ts10806

2020/08/20 03:51

コードはマークダウンのcode機能を利用してご提示ください。質問は編集できます。 あまり質問への追記修正依頼を無視するのは賢明ではないですよ。
momon-ga

2020/08/20 05:08

> 解答の繰り返しの構造も理解できず 回答が理解できないのは伝わりますが、どうなると想定してるか書いてくれませんか? 回答の解説の通りですの延長みたいな回答で満足するなら別にそのままでいいです
guest

回答5

0

1回目のループ
num = 0 で、numは3未満なのでループの中に入ります。
num *= 2 されて、num変数は0になります。
展開すると、num = 0 * 2 ですね。

2回目のループ
++num され、num変数は1になります。
numは3未満なのでループの中に入ります。
num *= 2 されて、num変数は2になります。
展開すると、num = 1 * 2 ですね。

3回目のループ
++num され、num変数は3になります。
numは3未満ではないので、ループを抜けます。

この時点でnum変数は3になっています。

++numの場合は、num変数がインクリメントされてから式が評価されます。
num++の場合は、式が評価されてからnum変数がインクリメントされます。
そのため、最後のprintlnで3が表示されるわけです。

投稿2020/08/20 03:52

ELBE

総合スコア305

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

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

0

既に回答が付いているように、for文の問題では無く、num++という後置インクリメントの仕組みの問題です。

(余談ですが、forの動きを調べる為なら、その結果を見るprintlnの中で余計な事はしないほうが良いです。
余計な要素を持ち込むことで今回のように、問題点がどこなのかをわからなくさせてしまいます。
forの動作を見るのであれば、純粋に可能な限りシンプルにした状態で見るべきです)

この後置インクリメントと言うやつは、見た目の感覚と異なる動きをする上に、よく言われる『あとから加算される』という説明も、
分かればそのとおりなのですが、分からない人には伝わり難いという、わりと躓きポイントです。

以下は別の場所に書いた物ですが、これで仕組みが掴めるきっかけにはなるかな、と。
(anumと置き換えて読んでください)

インクリメントの前置、後置には、よく「先に加算される」「後から加算される」という説明がなされていますが、これがまず混乱の元だと思います。

実際にはどちらも、式の評価(実行)と同時にaの値が加算されます。
では何が違うのか?というと、違いが出るのは式の値になります。

式の値とは、a++++aという式の持つ値の事です。

例えば、a=10の時、b=a+1と書いて、bに代入されるものが、a+1という式の値(11)です。
a+1と書いてもaの値は10のままで変化しない事から、式の値変数自体の値は別である事はわかると思います。

それを踏まえてインクリメントを見ると
a++++a共に、aという変数の値は即時に加算されます。
しかし、
a++の場合は式の値は加算前のもの
++aの場合は式の値は加算後のもの
となる事が違いとなります。

つまり、a++++aの差が出るのは、式の値を使う場合、例えば式の値を更に他の変数に代入するとか、他から参照するとかの場合だけになります。

そのうえで今回のものは、
num=3;として
(num++)と書いた場合、
numという変数の値は4になり、
num++という式の値は3になります。
num++3なので(num++)(3)になるので、
println((num++));は、3が表示されます。

num=3;として
println((num));は、もちろん3が表示されますので、結果的に同じ表示になります。

投稿2020/08/20 04:19

amiya

総合スコア1218

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

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

max-777

2020/08/20 05:51

回答ありがとうございます。ところで、num*=2を外した場合においても、num=3でした。なぜなのでしょうか。
amiya

2020/08/20 06:11

継続条件は num < 3 ですから、forブロックの開始時にnum=3ならば、ブロックは実行されずfor文を抜けます。 その後誰も値をいじらなければ、num=3のままです。 for文の動きを辿ってみてください。
max-777

2020/08/20 06:19

回答ありがとうございます。個人的にはその式の場合は、num=0 num=1 num=2が出力表示されると認識していました。自分でも未だに理解できません。
amiya

2020/08/20 06:25

おかしいなと思ったら、イメージだけで想像するだけではなく、 コードがどんな動きをするのか、1ステップずつ追いかける癖をつけたほうが良いです。 たとえば、 for(num=0; num<3; ++num){ } System.out.println("num="+num;); とした場合、何がどんな順番で行われるのか。 for文の仕様を良く読み返してみて、それを上の式に置き換えて、動作を展開して並べてみるとか。
max-777

2020/08/20 06:40

非常に基本的なことですが、尋ねてよいですか? 例題にfor(int count=0; count<5; count++){ System.out.println("count="+count); } 上記の出力した際にはcount=o count=1 count=2 count=2 count=3 count=4となり、そこからfor内の数値はその規定値未満にしなければならないとい偏見を抱いています。 だから、num=0 num=1 num=2となり、両者の違いが理解できていません。
amiya

2020/08/20 07:12

こちらの話はもう一方の話と同じ内容なので、そちらで。
momon-ga

2020/08/20 07:18

forの内側は、条件を満たすように未満でないというのは正しい認識です。 なので、forを抜けた場合は、未満じゃないです。 int count = 2000; for(count=0; count<5; count++){ System.out.println("count="+count); } System.out.println("-----"); System.out.println("ループを抜けた直後のcount="+count); で、理解できますか?
max-777

2020/08/20 07:29

count=0 count=1 count=2 count=3 count=4 ----- ループを抜けた直後のcount=5 上記の出力結果になりました。これってfor内は5未満であると理解することができました。 しかしながら、forを抜けた直後の5に違和感があります。count++はfor内で完結していますよね?単純にループから抜けて、4にcount++され、5になるという認識でよろしいでしょうか。
momon-ga

2020/08/20 07:34

> ループから抜けて、4にcount++され、5になるという認識でよろしいでしょうか。 違います。ループの最後にcount++されて、5になったのでループから抜けます。 for(count=0; count<5; ){ // ここの count++ を削除 System.out.println("count="+count); count++; } という感じです。
amiya

2020/08/20 07:40

続いてるみたいなのでこっちで。 最後にcount++されるから、であっています。 for文はそれ全体の意味で考えずに、 for(A;B;C)D; のAからDがどの順番で呼ばれるか?というふうに、分解して考えた方が、理解が早いと思います。
max-777

2020/08/20 07:49

お二人とも私のために時間を割いて頂き、ありがとうございました。自分自身で何とか理解できたような感じがしました。
guest

0

マークダウンのやり方を間違えています。
バッククォート3つで囲まれている「コード」という文字を、今書いているコードに置き換えてください。

本題に入ります。
変数名のあとの++は、後置インクリメントと呼び、変数の値を1増やす効果がありますが、「命令の結果」としては、増える前の値が返ってきます。
このnum++の後では、確かにnumは4になります。しかし、このnum++を書いた場所に返ってくる結果は、増える前の3になります。

投稿2020/08/20 03:29

swordone

総合スコア20651

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

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

0

しかしながら、最後のnum++をnumにしても実行結果は同じでした。

System.out.println("num="+(num++));

System.out.println("num="+(num));
は、どちらもnumの値を出力するので、どちらを書いても3が表示されます。
違いは、表示後に++されているかです。つまり前者はこの文の実行後にnumは4になってます。

投稿2020/08/20 03:28

otn

総合スコア84505

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

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

0

for文を実行する前のnumの値は1ですが、for文の最初に「num = 0」とあるので、繰り返しを開始する前にnumの値は0に設定されます。

あなたが確認したとおり、for文による繰り返しを終了する時点でnumの値は3になっていますよね。

繰り返し終了後のprintlnで表示される num++ の値は、「++で1増やされる前の値」なので、3と表示されます。その後、++演算子によりnumの値は4に更新されます。

投稿2020/08/20 03:23

編集2020/08/20 03:25
Daregada

総合スコア11990

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問