7

結果としてこのコードがどのように出力されるかを誰かに説明してもらえますか8 2

public class Check{

    public static void main(String args[]){

        int x=0;
        int y=0;

        for(int z=0;z<5;z++){
            if(++x>2||++y>2){
               x++;
            }
         }

         System.out.println(x+" "+y);

    }
}
4

8 に答える 8

10

反復 0, 1 では、条件が真ではないため、 で終了しx=2, y=2ます。

反復 2 以降では、最初の条件++x>2が true であるため、2 番目の条件は再度評価されません。yは 2 に固定されたままです。後続のループごとに、xは 2 回増加します ( を 1 回評価する++x>2と、 で 1 回x++;)。したがってx、4、6、および 8 になります。

于 2012-12-20T15:42:21.497 に答える
6

++xプレインクリメント xです。あなたの評価は以下のようになります。

INITIAL VALUES:
x=0, y=0
    z=0, 
    INVARIANT FOR z: z<5 ()
    WHEN z=0 
       CHECK IF 1>2 || 1>2
               THEN x++
     WHEN z=1
           CHECK IF 2>2 || 2>2
                THEN x++

     WHEN z=2
          CHECK IF 3>2 || 2>2 y cond is not eval as x cond satisfied
                THEN x++(inc 3++)

     WHEN z=3
          CHECK IF 5>2 || 2>2 // y cond is not eval as x cond satisfied
                THEN x++(inc 5 by 1)

     WHEN z=4
          CHECK IF 7>2 || 2>2 //y cond is not eval as x cond satisfied
                THEN x++(inc 7 by 1)


THUS : FINAL OUTPUT x= 8, y=2
于 2012-12-20T15:40:25.393 に答える
4

if チェックで ++x/++y をどのように取得するかがすべてです。ロジックに従ってください:

x=0 y=0 z=0

次に、if 行をヒットします。++x は 1 であり、>2 ではないため、y=1 を作成する ++y 部分を実行します。if の結果は false になり、値は次のようになります。

x=1 y=1 z=0

反復 2 が発生し、z=1 となります。その後、if 行にヒットします。++x は 2 であり、>2 ではないため、y=2 を作成する ++y 部分が実行されます。if の結果は false になり、値は次のようになります。今:

x=2 y=2 z=1

反復 3 が発生し、z=2 となります。その後、if 行にヒットします。++x は 3 で、>2 であるため、x++ が実行され (x=4 になります)、OR が真であるため、++y は実行されません。場合に。値は次のとおりです。

x=4、y=2、z=2

これを z=5 まで繰り返すと x=8, y=2 になります

于 2012-12-20T15:44:02.630 に答える
3

未知のコードを理解する方法:

  1. コードを適切にインデントします。これはコードを読むのに非常に役立ち、コードに慣れるための簡単で安全な操作です。

  2. 同じコードをより簡単な方法で表現する別の方法を見つけてみてください。変更のたびにコードを実行して、変更によって何も壊れていないことを確認してください。

    これは、適切な場所で置き換えること++xを意味します。x=x+1

  3. ネストされた複雑なif()条件を解きます。

したがって、書き直されたコードは次のようになります。

for(int z=0; z<5; z ++) {
    x = x + 1;
    if( x > 2 ) { // first half of the OR
        x = x + 1;
    } else {
        // first half of the OR is false, we end up here
        y = y + 1; // pre increment
        if( y > 2 ) {
            x = x + 1;
        }
    }
}

別の良い解決策は、貧乏人のデバッガーを使用することです。

for(int z=0; z<5; z++) {

    System.out.println("x="+x+", y="+y+", z="+z); // add this line in several places to see what happens
    ...
}
于 2012-12-20T15:48:08.103 に答える
1

ループの最初の実行

z=0 --> x=1, y=1

z=1 --> x=2, y=2

上記の場合、if の条件は false です。

また、if の条件が有効に実行されるたびに、x が 2 ずつインクリメントされます (プリインクリメントとポストインクリメント)。

y=2 が変わらないのはなぜですか? 論理演算子 '||' 実行、最初の条件が真の場合、他の条件を探したり実行したりしません

z=2 --> x=4, y=2

z=3 --> x=6, y=2

z=4 --> x=8, y=2

x=8 --- かつ y=2

于 2012-12-20T15:52:25.687 に答える
1

次のような「if」ステートメントで:

if (conditionA() || conditionB()) {...}

conditionA() が true を返す場合、必要がないため conditionB() はまったく呼び出されません。if ステートメント全体が true でなければなりません。

詳細: ループは 5 回実行されます。

1 回目: if() ステートメントで x と y が 1 にインクリメントされました。

2 回目: if() ステートメントで x と y が 2 にインクリメントされました。

3 回目: x が 3 にインクリメントされ、「if」ブロック内の実行をトリガーするのに十分です。|| の後の式を評価する必要がないため、y は再度インクリメントされません。(OR) 最初の部分が true の場合。

4 回目: x は 5 にインクリメントされますが、if() はまだ true であるため、x は再び 6 にインクリメントされます。

5 回目: if() で x が 7 にインクリメントされ、ブロックで 8 にインクリメントされました。

最終結果: x は 8、y は 2 です。

于 2012-12-20T15:53:59.663 に答える
0

System.out.println() ステートメントはループの外にあるため、println ステートメントは 1 回だけ実行されます。ループの反復ごとに、if ステートメントは x と y の値が 2 より大きいかどうかをチェックします。ただし、最初に両方の値をインクリメントします。ループの最初の 3 回では、条件は満たされていませんが、x と y は引き続きインクリメントされます。それ以降は毎回、x と y の両方が 1 ずつインクリメントされます。ただし、条件が満たされているため、x は追加の時間だけインクリメントされます。要するに、これは x と y が各反復後にどのように見えるかです:

z   x   y
--  --  --
0   1   1
1   2   2
2   4   3
3   6   4
4   8   5

編集: if ステートメント (||) の短絡ロジックにより、式の最初の部分のみが評価され、y がインクリメントされることはありません。その結果、y は 2 のままになります。

于 2012-12-20T15:46:29.203 に答える
0

for ループが 5 回実行されます。if x と y が最初の 2 回で 1 ずつインクリメントされると、x&y は 2 になりますが、if 条件は満たされていません。3 回目には x が 3 になり、y がチェックされないため、y は増加せず、if 内に入り、再び増加します。したがって、y は 2 になります。ただし、x は 2*2=4 ずつ増加するため、x=8 および y=2

于 2012-12-20T15:48:51.600 に答える