[英]precedence of && and || operators in java
Postfix operators [] . (parameters) expression++ expression--
Unary prefix operators ++expression --expression +expression -expression ~ !
Unary prefix creation and cast new (type)
Multiplicative * / %
Additive + -
Shift << >> >>>
Relational < <= > >= instanceof
Equality == !=
Bitwise/logical AND &
Bitwise/logical XOR ^
Bitwise/logical OR |
Conditional AND && //here
Conditional OR || //here
Conditional ?:
Assignment = += -= *= /= %= <<= >>= >>>= &= ^= |=
這是在kalid A Mughal&Rasmussen的書中發布的運算符優先級
根據這本書, &&
優先級高於||
但是下面的代碼
if(true&&false||true)
{
System.out.println("yes");
}
此代碼顯示"yes"
。 表示首先執行"||"
這本書錯了嗎? 或我的解釋錯誤。
我想你的解釋是錯誤的。 由於&&
優先級較高,因此評估順序為
(true && false) || true
這是
false || true -> true
您的解釋不對了。 如果我們遵循本書,則您的if語句可以重寫並保持相同的含義
if( (true && false) || true)
現在,很容易看到這確實是正確的,因此打印出“是”。
true && false
=> false
false || true
false || true
=> true
這樣就沒有問題,因為先執行and語句,然后再執行or語句。 該代碼的預期結果是yes
。
您的解釋是錯誤的
true && false -> false
false || true -> true
預期打印“是”
if(true && false || true)
==> if(false || true)
==> if(true)
。
和真值表:
F & F = F
T & F = F
F & T = F
T & T = T
或真值表:
F | F = F
T | F = T
F | T = T
T | T = T
仔細看,因為它們是短路 AND和OR
所以第一部分:
true&&false // evaluates to false
然后您有:
false || true
第一部分為假,但第二部分可能為真(實際上是),因此它檢查第二部分,看是否為真,因此返回true
如果您更改自己的表示,則可以更清楚地看到它,例如:
if(true || true && false) {
System.out.println("yes");
} else {
System.out.println("no");
}
如果&&
優先( true || (true && false) )
true,因此將打印“ yes”。
如果||
優先您將擁有( (true || true) && false)
它將為false並打印出“否。
如果運行上面的代碼,您將看到結果為“是”,因此&&
具有優先權。
首先對&&求值...,但對“或” ||的一側進行求值。 是真實的,因此整體表達式的計算結果為“真實”
if(true&&false||true)
{
System.out.println("yes");
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.