这个Java布尔表达式有什么问题?它为什么做它做的事情?

这个Java布尔表达式有什么问题?它为什么做它做的事情?,java,Java,我觉得自己很傻,很困惑,但这一点都不对劲 System.out.println(false&&true^true); 打印错误。我确信java在xor操作之前做and操作,所以我理论上认为使用*&&*s,java在and表达式中看到false时,会将整个表达式计算为false,但当我用下面的表达式测试我的理论时 System.out.println(假&真| |真); 打印出来的是真的。有人能给我解释一下吗?这真让我沮丧。按位运算符比逻辑运算符优先。所以^优先于&。因此: false &am

我觉得自己很傻,很困惑,但这一点都不对劲

System.out.println(false&&true^true);
打印错误。我确信java在xor操作之前做and操作,所以我理论上认为使用*&&*s,java在and表达式中看到false时,会将整个表达式计算为false,但当我用下面的表达式测试我的理论时

System.out.println(假&真| |真);

打印出来的是真的。有人能给我解释一下吗?这真让我沮丧。

按位运算符比逻辑运算符优先。所以
^
优先于
&
。因此:

false && true ^ true
你有:

false && true ^ true
false && false
false
false && true || true
false || true
true
&&
优先于
|
,因此:

false && true || true
你有:

false && true ^ true
false && false
false
false && true || true
false || true
true
^
是Java中的一种语言

基于,按位异或比逻辑运算符具有更高的优先级。此外,逻辑AND的优先级高于逻辑OR,因此您的两条语句实际上是:

System.out.println(false && (true ^ true)); // false && false -> false
System.out.println((false && true) || true); // false || true -> true

底线是
XOR
的优先级更高。因此,将首先计算
false
,因为它后面紧跟着and
,所以不计算语句的其余部分(&&short-cirched-the-evaluation)。但是,如果你想看到它的实际行动,这里是。在本例中,我将赋值给局部变量,否则编译器将以其无限的智慧预先计算常量(如您的示例)并获得结果。所以JVM从未真正执行过它

给定以下代码:

boolean f  = false;
boolean t1 = true;
boolean t2 = true;
boolean result = f && t1 ^ t2;
下面是字节码及其解释

  public static void main(java.lang.String[] args);
     0  iconst_0                // int 0 represents false
     1  istore_1 [f]            // store at f slot
     2  iconst_1                // int 1 represents true
     3  istore_2 [t1]           // store at t1 slot
     4  iconst_1               
     5  istore_3 [t2]           // same for t2
     6  iload_1 [f]             // load f onto stack
     7  ifeq 20                 // if equal to 0 (false), go to 20 and store 0 in boolean
                                // result.  This is the first indication that
                                // false was evaluated in isolation since false && any
                                // thing else would return false. So the XOR need not be 
                                // evaluated.  In your case it was `dead code`. But if `f` 
                                // were actually set to true.. 
    10  iload_2 [t1]            // load t1 and t2 on stack
    11  iload_3 [t2]            // 
    12  ixor                    // now do the XOR
    13  ifeq 20                 // if result is true, statement is true
                                // Remember! We're only here because f was true.

    16  iconst_1                // and load 1 (true onto stack) and store in result
    17  goto 21                 // else fall thru and store 0 in result.
    20  iconst_0
    21  istore 4 [result]
    23  return



查找“运算符优先级”
我确信java在异或运算之前执行and运算
,然后您需要仔细检查您的假设。^在整数值之间使用时是位运算符。当在布尔值之间使用时,它是一个函数。@user15187356我认为在意义上没有区别。您提供的链接在标题“Boolean Logical Operators”下有以下文本:“那么按位运算符表达式的类型是Boolean”,因为在封面下,它仍在执行按位运算。只是对于布尔值,按位和逻辑是等价的。我想这就是为什么Java没有费心定义
^^
。在Java SE规范中,您提到:“当&、^或|运算符的两个操作数均为布尔或布尔类型时,则按位运算符表达式的类型为布尔。”。这句话表明Sun认为运算符即使在布尔值之间也是按位的。我不知道你从同一段中得到了什么来反驳。哎呀……我的意思是“按位运算符”。我会解决的。我并不是说特定运算符出现的上下文会改变其优先级。-我想我们仍在争论的问题是,当它们应用于布尔值对时,在“按位运算符”、“逻辑”或“按位”上放置哪个标签是否有任何区别。因为我从来没有过这种区别对我来说很重要,我也不知道为什么会这样,我个人对这个问题不太感兴趣。我认为它是语义,而不是任何技术上的关联。但是我已经准备好接受其他方面的教育了表达式
True@user15187356-我明白了…这一节的标题。我相信这只是语义学。这意味着最终的结果可以被看作是合乎逻辑的,因为你还可以用布尔值做什么?但细节显示“运算符”仍然是“按位”的。另外,如果你看WJS的新答案,它表明即使操作数是布尔数,也会执行一个整数异或。如果我们讨论的是语义,那么我不管用哪种方式。除非你给什么东西贴上什么标签,以及它是如何运作的,否则这种区别是毫无意义的。我认为这种区别对我的整个Java职业生涯毫无意义,而我的整个Java职业生涯始于Java1.0的beta版。如果它在技术上没有意义,那么就我的回答而言,它就没有意义了。我想我们还是在谈论这个,因为我说的是“逻辑运算”而不是“逻辑运算符”,因为我认为它们是相同的。由于其他人不这样做,我修改了我的答案,使区别变得无关紧要。