布尔表达式的编译错误

时间:2012-11-29 16:13:34

标签: java compilation boolean

这是一段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

我知道它会执行短路,但在&&amp ;;双方都需要进行评估。那不是作业,我正在学习Java。 干杯

4 个答案:

答案 0 :(得分:6)

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

相当于: -

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

由于(a = true)被评估为true,因此不评估第二个表达式,因为你在那里使用短路运算符(||)

因此最后两项任务不会发生。 bc的值仍为false

注意: - 如果先前的评估可以获得某个结果,则短路操作员 - &&||不会进一步评估。

所以: -

    如果 a 为false,
  • a && b将无法评估 b

  • 如果 a 为真,
  • a || b将无法评估 b

答案 1 :(得分: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,将a设置为true并评估为true。由于||是短路的,因此不会评估||(b = true) && (c = true))的RHS。

注意表达式

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

相当于:

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

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

如果是后者,你会得到true, false, true

这是因为&&具有更高的优先级(“比”更紧密“)||。有关运算符优先级的完整列表,请参阅Java tutorial

答案 2 :(得分:2)

static boolean a;
static boolean b; 
static boolean c;

因为你没有用你的布尔值初始化,所以java会分配默认值“false”;

问题在于:

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

因为第一次评估返回true(a = true) - >如果第二部分没有“执行”,则为真。

使用运算符|| (true || //do not matter) =真。是一种优化形式,不需要计算后半部分,第一部分已被评估为真。

答案 3 :(得分:1)

如果可能......

看起来有些人并没有得到问题所在。

x =(a = true)|| (b =真)&& (C == TRUE);

从&&优先级高于||,似乎(b = true)&& (c == true)应首先进行评估,从而将b和c设置为true。如果&&具有更高的优先级,为什么是||的操作数之一首先评估?

Rohit Jain到目前为止已经解释得最好。我可能补充的是,运算符的优先级并没有规定操作数的计算顺序 - 只是作为其他运算符的操作数必须完成的操作,如果不是短路运算符不必要的话。优先级决定了表达式的树(具有讽刺意味的是,先验较高的运算符在树中较低),但是无论运算符优先级如何,树都将按深度优先和从左到右进行求值。

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

首先,将a = true与执行赋值的“副作用”一起计算为值true。自||短路,另一边甚至没有看过。

如果你真的想要&& (及其操作数)首先要评估,你必须重写表达式:

x =(b = true)&& (c = true)|| (A = TRUE);

当然,然后将b和c设置为true,并且因为||而保持为false短路。

我认为我没有解释任何新内容,只是以较小的步骤解释相同的信息。