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,因此不评估第二个表达式,因为您在那里使用短路运算符 (||)

因此最后两个任务不会发生。b和的价值c仍然存在false

注意: -短路运算符 -&&||, 如果可以通过先前的评估获得某个结果,则不会进一步评估。

所以: -

  • a && b如果a为假,则不会评估b 。

  • a || b如果a为真,则不会评估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||被评估,设置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 教程

于 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 第二部分没有“执行”。

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

于 2012-11-29T16:14:09.080 回答
1

如果我可以......

看起来有些人不太明白这个问题是什么。

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) || (一=真);

当然,然后将 b 和 c 设置为 true,而 a 仍然为 false,因为 || 短路。

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

于 2012-11-29T16:22:37.383 回答