2017-10-24 1 views
1

先週のテストでこの課題がありました。 私の答えは「k」(5回の反復で2回文字を増分)でした。 これをintelliJで実行すると、 "c"になります。 先生は「h」と教えてくれます。 私は完全に失われています。誰も私にそれを説明してもらえますか?ありがとうございました!増分のいくつかの反復について説明しますか?

public class main { 
     public static void main(String[] args) { 
      char a = 'a'; 
      for (int i = 0; i <= 5; i++) ; 
      a++; 
      ++a; 

      System.out.println(a); 
     } 
    } 
+0

a ++ = b、++ a = cしたがって、cを参照してください。セミコロンを削除すると、出力がhになります。 – SMA

+1

for文の後に ';'を見て、ループの本体に何が含まれているかを考えます。 – Thomas

+0

これは実際にはインクリメントがループ内にないので '' c''を表示します。 – f1sh

答えて

4

のは、何が起こっているのか(行ずつ)を見てみましょう:

public static void main(String[] args) { 
    char a = 'a';     // <- start from 'a' 
    for (int i = 0; i <= 5; i++) ; // <- trick: the loop does nothing: please notice ";" 
    a++;       // <- increment : 'a' + 1 = 'b' 
    ++a;       // <- increment : 'b' + 1 = 'c' 

    System.out.println(a);   // print out: ('c') 
    } 

だから、'c'を持っています。

public static void main(String[] args) { 
     char a = 'a';     // <- starts from 'a' 

     for (int i = 0; i <= 5; i++) // <- six times... 
     a++;       // <- increment: 'a' + 1 + 1 + 1 + 1 + 1 + 1 = 'g' 

     ++a;       // <- increment: 'g' + 1 = 'h' 

     System.out.println(a);  // print out ('h') 
    } 

ご理解

インクリメント手紙回:あなたの教師は、propably、(:ループため;のabscence、唯一の違いを何卒ご了承下さい)以下のコードを示唆しました反復数

は、この行の末尾に

public static void main(String[] args) { 
    char a = 'a';     // <- starts from 'a' 

    for (int i = 0; i < 5; i++) // <- five times... (please, notice < instead of <=) 
    {        // do two increments in a loop 
    a++;       // <- first increment 
    ++a;       // <- second increment 
    } 

    System.out.println(a);  // print out ('k') 
} 
+0

ありがとう!割り当ては "> ="の状態であり、中括弧はありませんでした。中括弧を追加することによって何が違う結果になるのか聞かせてもらえますか? – Vantalim

+0

@Vantalim:* forループ*は1回の操作しか実行しません。 '{}'を追加することで、いくつかの操作(あなたの場合は 'a ++;'と '++ a;')を –

+0

ビンゴにまとめます。ありがとうございます:) – Vantalim

3

;として実装する必要があります。

for (int i = 0; i <= 5; i++) ; 

...ループは何もしないことを意味します。ヌルステートメントが添付されています。

したがって、aは2回インクリメントされるため、実行すると'c'になります。その行の終わりに;なし

、次の行のa++そうaそうでi == 1再度、一度i == 0ため(ループにより6回インクリメントし、される、ループ内であろうがi == 5を含む)を'g'に、次にループ(++a)をhの後に再計算します。

+0

ありがとうございました!私が作った基本的な間違いを見つけ出すことに明らかに失敗したことを除いて、これはそれをより明確にした。だから私はループの一回の実行後にfor-loopのカウンタがインクリメントされることを正しく理解していますか? – Vantalim

+0

@Vantalim:はい。 'for'ループは、* Initialization *、* test *、* increment *、* body *の4つの部分を持っています。これは次のように動作します。 2. Do * test *を実行し、resultがfalseの場合はループを終了します。 3.ド*ボディ*; 4. * *を増分します。 5.ステップ2に進みます。 –

+1

あなたは素晴らしいです。ありがとうございました! – Vantalim

1

forループは;で終了します。これにより、forループは完全に無関係になり、効果はありません。

残りは講師が答えは「H」であるあなたを言っているなら、あなたはミスがコードをコピーしたことがありac

+0

ありがとう、私はこれを見つけたはずです!私は全く新しいので、もっと詳細なトレーニングが必要です。 – Vantalim

0

を作るだけで2単位です。 'h'を取得するには、次のようにする必要があります。

public class main { 
     public static void main(String[] args) { 
      char a = 'a'; 
      for (int i = 0; i <= 5; i++) 
      a++; 
      ++a; 
      System.out.println(a);   
     } 
    } 
+0

あなたは絶対に正しいです。私と一緒にコードをコピーするのを忘れて、あなたが示唆したコード。 – Vantalim

関連する問題