0

これは Java コードのスニペットです。

static boolean a; // gets false
static boolean b; 
static boolean c;

    public void printA(){

         boolean bool = (a = true) || (b = true) && (c = true);    
         System.out.print(a + ", " + b + ", " + c);     
    }

コンパイルされません。問題は何ですか? エラー: この行に複数のマーカーがあります。'bool' 変数の行に構文エラーがあります。印刷されると思いますtrue, false, true。私のチュートリアルブックによると、それは印刷されますがtrue, false, false

短絡を実行することは理解していますが、&& の場合は両側を評価する必要があります。それは宿題ではありません。私は Java を学んでいます。乾杯

4

4 に答える 4

6
(a = true) || (b = true) && (c = true);

と同等です: -

(a = true) || ((b = true) && (c = true));

(a = true)は に評価されるため、短絡演算子 (||)trueを使用しているため、2 番目の式は評価されません。

したがって、最後の 2 つの割り当ては発生しません。と の値は のbままcですfalse

注: -短絡演算子 - &&and ||, は、前の評価で特定の結果が得られる場合、それ以上評価しません。

そう: -

  • a && baが falseの場合、 bは評価されません。

  • a || baが真の場合、 bを評価しません。

于 2012-11-29T16:15:47.717 に答える
3

私にとってコンパイルエラーはありません-これはうまくいきます:

public class Test {
    static boolean a;
    static boolean b;
    static boolean c;

    public static void main(String[] args) {
        boolean bool = (a = true) || (b = true) && (c = true);
        System.out.print(a + ", " + b + ", " + c);
    }
}

プリントアウトします

true, false, false

これは、 の LHSが評価され、 true||に設定され、に評価されるためです。が短絡しているため、 (これは ) の RHS は評価されません。atrue||||(b = true) && (c = true)

式に注意してください。

(a = true) || (b = true) && (c = true);

次と同等です。

(a = true) ||  ((b = true) && (c = true))

いいえ

((a = true) || (b = true)) && (c = true)

後者の場合は、true, false, true.

これは、&&優先順位が高いためです (「バインドがよりタイト」) ||。演算子の優先順位の完全なリストについては、 Java チュートリアルを参照してください。

于 2012-11-29T16:17:21.233 に答える
2
static boolean a;
static boolean b; 
static boolean c;

ブール値で初期化しなかったため、Java はデフォルト値「false」を割り当てます。

問題はそれです:

(a = true) || (b = true) && (c = true);  

最初の評価は true (a = true) -> true を返すため、2 番目の部分は「実行」されません。

演算子 || を使用 (true || //do not matter)= 真。最適化の一形態であり、最初の半分がすでに true と評価されている場合、後半を計算する必要はありません。

于 2012-11-29T16:14:09.080 に答える
1

もしよろしければ....

質問の意味がよくわからない人もいるようです。

x = (a=真) || (b=真) && (c==真);

&& は || よりも優先順位が高いため、(b=true) && (c==true) を最初に評価して、b と c を true に設定する必要があるようです。&& の優先順位が高い場合、|| のオペランドの 1 つはなぜですか? 最初に評価?

Rohit Jain がこれまでのところ最もよく説明しています。私が追加するかもしれないのは、演算子の優先順位はオペランドが評価される順序を決定するのではなく、短絡演算子によって不要にされない場合、他の演算子のオペランドとしてどの操作を完了する必要があるかだけです。優先順位は式のツリーを決定します (皮肉なことに、優先順位の高い演算子はツリーの下位に移動します) が、ツリーは演算子の優先順位に関係なく、深さ優先で左から右に評価されます。

     ||
   /    \
 =      &&
/ \    /   \
a t    =   =
      / \ / \
      b t c t

最初に a=true が評価され、代入を行うことの「副作用」が true の値になります。|| 以降 短絡、反対側は見られません。

&& (およびそのオペランド) を最初に評価したい場合は、式を書き直す必要があります。

x = (b=真) && (c=真) || (a=真);

もちろん、b と c は true に設定され、a は false のままです。短絡。

新しいことは何も説明していないと思いますが、同じ情報をより小さなステップで説明しただけです。

于 2012-11-29T16:22:37.383 に答える