这个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版。如果它在技术上没有意义,那么就我的回答而言,它就没有意义了。我想我们还是在谈论这个,因为我说的是“逻辑运算”而不是“逻辑运算符”,因为我认为它们是相同的。由于其他人不这样做,我修改了我的答案,使区别变得无关紧要。