5

今日、私はこのパズルに出くわしました。明らかに、これは正しいスタイルではありませんが、出力が出ない理由についてはまだ興味があります。

int x = 9;
int y = 8;
int z = 7;

if (x > 9) if (y > 8) System.out.println("x > 9 and y > 8");

else if (z >= 7) System.out.println("SHOULD OUTPUT THIS x <= 9 and z >= 7");

else
  System.out.println("x <= 9 and z < 7");

上記は実行時に出力がありません。しかし、if ステートメントに括弧を追加すると、突然、ロジックが期待どおりに動作します。

int x = 9;
int y = 8;
int z = 7;

if (x > 9) {
  if (y > 8) System.out.println("x > 9 and y > 8");
}

else if (z >= 7) System.out.println("SHOULD OUTPUT THIS x <= 9 and z >= 7");

else
  System.out.println("x <= 9 and z < 7");

これは、「SHOULD OUTPUT THIS x <= 9 and z >= 7」を出力します。ここで何が起こっているのですか?

ありがとう!

4

4 に答える 4

7

このように最初の方法を書き直すと(これがどのように動作するか)、理解しやすくなります

if (x > 9)
  if (y > 8) System.out.println("x > 9 and y > 8");
  else if (z >= 7) System.out.println("SHOULD OUTPUT THIS x <= 9 and z >= 7");
  else
    System.out.println("x <= 9 and z < 7");

x が > 9 ではないため、ブロックは実行されません。

于 2012-10-05T04:19:33.527 に答える
4

これ:

if (x > 9) ... if (y > 8) ... else if (z >= 7) ... else

はあいまいです。これは、解析中にが最初または 2 番目elseの にバインドされる可能性があるためです。(これはダングリング問題と呼ばれます)。Java (および他の多くの言語) がこれに対処する方法は、最初の意味を無効にすることです。そのため、句は常に最も内側のステートメントにバインドされます。ififelseelseif

于 2012-10-05T04:22:24.557 に答える
0

最も内側のレベルでelseブロックを使用しているため

あなたのコードは次のコードとして扱われています

if (x > 9) // This condition is false, hence the none of the following statement will be executed
{
    if (y > 8) 
    {
        System.out.println("x > 9 and y > 8");
    } else if(z >= 7)
    {
        System.out.println("SHOULD OUTPUT THIS x <= 9 and z >= 7");
    }
    else 
    {
        System.out.println("x <= 9 and z < 7");
    }
}

if ステートメントで指定された最初の条件は false であり、その条件に関連付けられたコードに入らず、単にプログラムの最後に到達して何も出力しないことを制御します。

そのため、単一のステートメントを記述している場合でも、ステートメントを括弧で囲むのが通常の方法です。

于 2012-10-05T04:22:44.423 に答える
0

コードのインデントを修正するだけで、問題が明確になります。

int x = 9;
int y = 8;
int z = 7;

if (x > 9)
    if (y > 8)
        System.out.println("x > 9 and y > 8");
    else if (z >= 7)
        System.out.println("SHOULD OUTPUT THIS x <= 9 and z >= 7");
    else
        System.out.println("x <= 9 and z < 7");
于 2012-10-05T04:20:07.780 に答える