0

私が知っていることから、 for ループのスコープは、その後に一連の括弧がなくても、1 つのステートメントにすぎません。右?では、このコードは次のようになります。

    for(int x = 0; x < 3; x++)
        if(x < 2) 
            System.out.println("hello");
            System.out.println("world");

出力を与えます:

hello
hello
world

のステートメントifも for ループの一部と見なされますか? もちろんそうです、私の質問はなぜですか?上記のコードを次のように変更すると、スコープが for ステートメントの直後のブロックであることが実際にはどうなりますか。

    for(int x = 0; x < 3; x++)
        if(x < 2) { 
            System.out.println("hello");
            System.out.println("world");
        }

出力を与えます:

hello
world
hello
world

編集:以下の回答のほとんどは、上記のコードのフロー制御の説明に関するものです。私はすでにそれを知っています。私の質問は、for ループ スコープの規則に関するものでした。

ルールは実際には、ブレースレス ループのスコープは、forその直後のステートメントの次のブロックであるということですか?

4

6 に答える 6

3
First x=0
 Then if (x < 2) condition satisfies (again no braces, so only one statement executes)
   Prints "hello"
for loop continues
x=1
 Then if (x < 2) condition satisfies (again no braces, so only one statement executes)
   Prints "hello"
  for loop continues
x=2
 Then if (x < 2) condition NOT satisfies, so if statement won' execute, moves to print "world"
   Prints "world"

最初のスニペットは次のように扱われます。

for(int x = 0; x < 3; x++){
        if(x < 2) {
            System.out.println("hello");
        }
}
            System.out.println("world");
于 2012-08-17T04:08:24.487 に答える
3

有害と見なされる場合は、Bracelessを読む必要があります。この投稿は、このような例のために特別に作成されました。ブレースのない制御フロー ステートメントは、特に誤解を招くインデント (例のように) で、かなり長い間頭を悩ませる可能性があるという混乱。

貼り付けたコードは、次と同等です。

for (int x = 0; x < 3; x++) {
  if (x < 2) {
    System.out.println("hello");
  }
}
/* outside of the for */
System.out.println("world");

ご覧のとおり、ループは 3 回繰り返されます。最初の 2 つは出力されます"hello"。ループが完了すると、 が出力されます"world"


これが機能する理由は、Java 言語仕様の第 14 章を読むと明らかです。実際、§14.5 に従って、ブロックをステートメントと考えるのは理にかなっています。

for (int x = 0; x < 3; x++)
   if (x < 2) 
      System.out.println("hello");
      System.out.println("world");

if(§14.9)basic for (§14.14.1 )の説明を見ると、どちらもステートメントを取るだけであることがわかります。この場合、forステートメントにステートメントが含まれておりif、それ自体がステートメントをカプセル化していることがわかりますprintln("hello")。ステートメントに続いforて、あなたのprintln("world")ステートメントがあります。

for (int x = 0; x < 3; x++)
    if (x < 2) { 
      System.out.println("hello");
      System.out.println("world");
    }

ここで、forステートメント本体がステートメントであることがわかります。これは、 2 つのステートメント、つまり両方のステートメントを含むブロックifをカプセル化します。これは実際には前者と同じではないことに注意してください。println

うまくいけば、これで問題が解決します。

于 2012-08-17T04:12:53.203 に答える
1

loop の 1 行後、 condition は loop の body で考慮され、 condition は使用されなかったのでfor body で {}のみ考慮されますif

   for(int x = 0; x < 3; x++)
        if(x < 2) 
            System.out.println("hello");
            System.out.println("world");

出力を与えるhello hello world理由

if ステートメントの後の 1 行のみが for ループで考慮され、ループがworld印刷を終了するときに考慮されます。

そのような

for(int x = 0; x < 3; x++)
      {  if(x < 2) 
            System.out.println("hello");
       }
     System.out.println("world");

そして

 for(int x = 0; x < 3; x++)
        if(x < 2) { 
            System.out.println("hello");
            System.out.println("world");
        }

両方とも System.out.println("hello"); System.out.println("world");forループで考慮します

于 2012-08-17T04:08:32.847 に答える
0

こう見て…

for囲まれた次のステートメントまたは次のブロックifを制御します。{...}

{}次のステートメントのみが欠落している場合は、本体と見なされます。

最初のケースでは、体の部分がはっきり見えるようにインデントを修正しました。

for(int x = 0; x < 3; x++)  
    if(x < 2)   
        System.out.println("hello");
System.out.println("world"); 
于 2012-08-17T04:08:44.643 に答える
0

ループまたは条件文の後に次の行のみを配置しない場合は{}、そのスコープの一部と見なされます。

于 2012-08-17T04:09:53.283 に答える
0

それは正しいことをしています。i = 0 と 1 の場合は「hello」を出力し、次に for ループが終了すると「world」が出力されます。

あなたは配置に混乱していると思います。最初の配置は次のようになります-

for(int x = 0; x < 3; x++) {
    if(x < 2) {
        System.out.println("hello");
    }
}
System.out.println("world");

そして二つ目――

for(int x = 0; x < 3; x++) {
    if(x < 2) { 
        System.out.println("hello");
        System.out.println("world");
    }
}

より読みやすく、ロジックを理解しやすくなります。

于 2012-08-17T04:10:00.113 に答える