Java 布尔表达式上的编译错误

Java 布尔表达式上的编译错误,java,compilation,boolean,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); } 它

这是一段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”变量行出现语法错误。 我希望它打印出真的,假的,真的。 虽然根据我的指导书,它打印的是真、假、假

我知道它会短路,但在&&的情况下,需要对两侧进行评估。那不是家庭作业,我在学Java。 干杯

由于没有使用布尔值进行初始化,java将分配默认值false

问题在于:

(a = true) || (b = true) && (c = true);  
由于第一次求值返回true a=true->true,因此第二部分不执行

使用运算符| | true |//donot matter=true。是一种优化形式,无需计算后半部分,因为前半部分已被评估为真

(a = true) || (b = true) && (c = true);
相当于:-

(a = true) || ((b = true) && (c = true));
由于a=true的计算结果为true,因此不计算第二个表达式,因为您在那里使用的是短路运算符| |

因此,最后两个任务不会发生。b和c的值仍然为假

注:-短路运算符-&&和| |,如果可以通过先前的评估获得特定结果,则不进行进一步评估

因此:-

如果a为false,a&&b将不计算b

如果a为真,a | | b将不会计算b


对我来说没有编译错误-这很好:

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。由于| |短路,不计算| |的RHS,即b=true&&c=true

请注意,表达式

(a = true) || (b = true) && (c = true);
相当于:

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

如果是后者,你会得到真的,假的,真的

这是因为&&具有比| |更高的优先级。有关运算符优先级的完整列表,请参见。

如果可以的话

     ||
   /    \
 =      &&
/ \    /   \
a t    =   =
      / \ / \
      b t c t
看起来有些人不太明白问题是什么

x=a=true | | b=true&&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,而a仍然为false,因为| |短路


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

每当你声称存在编译错误时,你应该给出一个完整的示例来演示它并显示编译错误。
     ||
   /    \
 =      &&
/ \    /   \
a t    =   =
      / \ / \
      b t c t