java
1public class Main { 2 public static void main(String[] args) { 3 for (int i=0;i<3;i++) { 4 System.out.print(i+1); 5 } 6 } 7}
の場合は123になるのですが
java
1public class Main { 2 public static void main(String[] args) { 3 for (int i=0;i<3;i++) { 4 System.out.print(i++); 5 } 6 } 7}
++はa+1と同じと学んだのですが、この場合は02となるのは何故ですか?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答4件
0
++はa+1と同じ
ぜんぜん同じではありません。a++
はaの値を変化させるのに対し、a+1
だけではaの値は変化しません。
System.out.print(i+1);
これはi+1の計算結果をSystem.out.print
に渡す操作です。
i
に0が入っているとき、System.out.print
に渡される値は0 + 1
つまり1で、i
そのものはここでは変化しません。
その後、for文のi++でi
は0から1となりループします。
System.out.print(i++);
こちらはi
の値をSystem.out.print
に渡し、i
を1増やす操作です。
iに0が入っているとき、System.out.print
に渡される値は0で、その後i
は1増やされて0から1に変化します。
その後、for文のi++でi
は1から2となりループします。
投稿2021/09/16 10:34
総合スコア509
0
i++
はi+1
と同等ではありません。
正しくは**i
を評価した後に、i
に1を加算する**というものです。(インクリメント)
このことからSystem.out.print(i++)
のコードを等価のコードに分解するとこうなります。
java
1System.out.print(i); 2i = i + 1;
この場合、forループ1周でi
は2ずつ増えるので、02
と表示されることになります。
なお、System.out.print(++i)
というように、変数の前に++
を付けた場合は値が評価される前に1が加算されるので、こう解釈できます。
java
1i = i + 1; 2System.out.print(i);
投稿2021/09/16 10:40
総合スコア497
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
System.out.print(i++);
ここでも+1してますやん
++はa+1と同じと学んだのですが、
ちがいます
投稿2021/09/16 10:33
編集2021/09/16 10:34総合スコア88051
0
ベストアンサー
変数 a があるとして、a++ は a = a + 1 とは厳密には違うようです。(意味は同じだが)
まず ++演算子には 後置型と前置型があるようです。a++ と ++a ですね。
で、この後置型 ( a++ ) は 「処理をした後にインクリメントをする」ようです。
System.out.print(i++);
であれば、まず iの値を出力してから +1 するようです。
とりあえず、コードを読んでみましょう。
サンプルとして後者の i++ をしている方を見ましょうか。
public class Main { public static void main(String[] args) { // 変数iの初期値: 0, iが3未満の間, i++しながらループ for (int i=0;i<3;i++) { // i++の値を出力 System.out.print(i++); } } }
となっていますが、「i++の値を出力」は「iの値を出力」と「i++する」の二つに分けられるので、
[疑似コード] 1. 変数iの初期値: 0, iが3未満の間, i++しながらループ 1.1. iの値を出力 1.2. i = i + 1
となりますね。
この疑似コードを現実世界でシミュレーションしてみてください。
まず (1) で i = 0 になる。(初期値なので)
そして(1.1)によって 0 が出力される (i=0なので)
(1.2)によって、i + 1 = 0 + 1 = 1、つまり i = 1 となる。
さらに(1)に戻ります。
条件( i < 3 ) は満たしますか? 1 < 3 なので処理する。
ただし、(int i=0;i<3;i++) の i++ の部分で i + 1 = 1 + 1 = 2 となり、i = 2 となる。
(1.1) で 2が出力される。( i = 2 なので )
(1.2) で i + 1 = 2 + 1 = 3 となる。で、そのまま (1)に。
しかし、(1)では i = 3となっていて、3 < 3 を満たさないので処理せずに終了。
つまり、「02」と表示されるのです。
おそらく、++i とすれば、「13」となるはずです。
同じように考えてみましょう。
前置型は +1 してから渡す ので、System.out.print( ++i );
は、
i + 1 してからその値が printメソッドに渡されるはずです。
よって、疑似コードだと、
[疑似コード] 1. 変数iの初期値: 0, iが3未満の間, i++しながらループ 1.1. i = i + 1 1.2. iの値を出力
となりますね。
i = 0 -> i + 1 = 1 -> (「1」が出力される)
-> i = 1 -> i + 1 = 2 -> i + 1 = 3 -> (「3」が出力される)
ですね。
投稿2021/09/16 10:54
編集2021/09/16 10:55総合スコア4962
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/09/16 12:01