【问题标题】:compilation error on boolean expression布尔表达式的编译错误
【发布时间】:2012-11-29 16:13:34
【问题描述】:

这是一段 Java 代码的 sn-p:

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。 干杯

【问题讨论】:

  • 当你声称存在编译错误时,你应该给出一个完整的例子来证明它显示编译错误。

标签: java compilation boolean


【解决方案1】:
(a = true) || (b = true) && (c = true);

相当于:-

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

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

因此最后两个分配不会发生。而bc 的值仍然是false

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

所以:-

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

  • a || b 不会评估 b,如果 a 为真。

【讨论】:

    【解决方案2】:

    对我来说没有编译错误 - 这工作正常:

    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

    【讨论】:

      【解决方案3】:
      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) = 真。是一种优化形式,不需要计算后半部分,因为前半部分已经被评估为真。

      【讨论】:

        【解决方案4】:

        如果可以的话……

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

        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 因为 ||短路。

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

        【讨论】:

          猜你喜欢
          • 2012-05-22
          • 1970-01-01
          • 1970-01-01
          • 2016-02-24
          • 1970-01-01
          • 1970-01-01
          • 2017-01-06
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多