5

これは私の最初の投稿ですので、プロトコルエラーはご容赦ください。

私の質問は、次のJavaコードで何が起こっているのかを理解しようとしているだけです。括弧を使用するとすべてが明確になることは十分に理解していますが、結果の出力は、Javaの演算の順序に関する規則に反して飛んでいるようです。

public class Tester
{
   public static void main(String[] args)
   {
    int total=9, num=13;
    if (total>4 || ++num>15 && total>0)
    {
           System.out.println("short");
    }
    System.out.println(num);
   }
}

出力は次のとおりです。short13

++numが実行されなかったことは明らかです。厳密な操作の順序が守られていれば、それが最初に発生するはずでした。そうではありませんでした。次は&&です。&&が||よりも優先順位で行われる場合、同じ...++numが最初に発生するはずです。そうではありませんでした。したがって、私には、出力は||で決定されたようです。最初に実行され、++ numを短縮してから、&&を操作すると、短縮形が出力されました。演算規則の順序は単に無視され、ブール式は左から右に実行されましたか?インクリメント演算子が不規則な動作を引き起こしていますか?

このコードで実際に何が起こっているかについての洞察に感謝します。

4

5 に答える 5

6

これは、優先順位/結合性(式の解析方法を扱う)とは関係ありません...これは、Javaの評価順序(左から右)と関係があります。あなたは短絡論理がどのように機能するかを誤解しているようです。

&&and||演算子は、2つのブール式に対してConditional-ANDおよびConditional-OR演算を実行します。これらの演算子は「短絡」動作を示します。つまり、第2オペランドは、必要な場合にのみ評価されます。


それでは、この式を段階的に評価してみましょう...

total > 4 || ++num > 15 && total > 0

total > 4に評価されるため、true条件はに評価され、残りの条件を評価するのではなく、すぐtrueに分岐が行われます。if

に変更totalすると、短絡OR4の左オペランド( )はであるため、右オペランド()が評価されます。total > 4false++num > 15 && total > 0

に変更numすると15、短絡AND左オペランド(++num > 15)はに評価されtrue、最終的にAND右オペランド(total > 0)が評価されて、条件がであるかどうかが判別されtrueます。falseの場合total > 0、条件もfalseです。

以下は、フローを強調するためにわかりやすくするために書き直されたコードです。

if (total > 4) {
  System.out.println("short");
} else {
  if (++num > 15) {
    if (total > 0) {
      System.out.println("short");
    }
  }
}
System.out.println(num);

Java条件演算子の詳細については、関連するJavaチュートリアルを参照してください。

于 2012-08-07T01:32:10.180 に答える
4

doubleまたは(||)を使用すると、Javaの短絡がアクティブになります。(これが必要ない場合は、単一の|を使用してください)。すべてが真になり、短絡または(||)にぶつかると(または何かが間違っていて、短絡&(&&)にぶつかると)、すぐに発生します。したがって、あなたの場合、合計は4より大きいので、そこで停止し(||のため)、ifステートメントにtrueを返し、短く出力します。num変数をインクリメントする部分に到達することはありません。これは、それをチェックする必要がないためです。

于 2012-08-07T01:31:59.537 に答える
3

何が起こっているのかは短絡評価です。total > 4true、全体を条件付きにしtrueます。の後に続くものを見る必要さえありません||。これは、C、C ++、およびJavascript(他の多くの中でも)にも存在する非常に一般的なランタイム最適化です。あなたはその副作用を観察しました。

短絡はあなたの利益のために使用される可能性があることに注意してください(たとえば、||またはの左側をチェック&&して(非)null値をチェックする)、またはそれはあなたを混乱させる可能性があります(あなたの質問でしたように)。賢く使って、若いパダワン。

于 2012-08-07T01:32:51.690 に答える
0

コンピュータはこの合計のようなブール式をあなたの下に置きます>4|| (++ num> 15 && total> 0)。これは、標準SQLの式に似ています。&&を見つけて、左右の2つの式を取得し、ちょうど行ったように角かっこに入れます。コードでは、total =9>4および++num=14<15およびtotal=9> 0であるため、結果はtrue ||(false && true)=trueになります。端末は「short」と13であるnumを出力します。

私の答えがお役に立てば幸いです。私が間違っている場合は、私を訂正してください

于 2012-08-07T01:38:01.400 に答える
0

if句で使用する場合、変数の実際の値は変更されないと思います。メモリに保存されている値は同じままです。式のnum+1>15のようなものです

于 2012-08-07T04:58:04.690 に答える