2012-08-17 86 views
0
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 = += -= *= /= %= <<= >>= >>>= &= ^= |= 

该运营商的运算符优先级S以这本书&&||更高的优先级刊登在kalid一个莫卧儿&拉斯穆森书在Java中

,但下面的代码

if(true&&false||true) 
{ 
    System.out.println("yes"); 
} 

这个代码打印"yes"。意思是第一次执行"||"

这本书是否错了?或者我的解释错误。

+1

这不是一个有效的测试。 (true && false)== false。 false || true == true。 – 2012-08-17 17:30:21

回答

3

我想你的解释是错误的。由于&&具有更高的优先级评价的顺序是

(true && false) || true 

这是

false || true -> true 
0

你的解释是关闭的。如果我们按照这本书,你的if语句可以重新编写,并保持相同的含义

if((true && false) || true) 

现在是很容易看到,这样做实际上评估为真,因此打印出“是” 。

0
  1. true && false =>false
  2. false || true =>true

因此,没有问题,因为和语句执行第一然后或语句。代码的预期结果是yes

0

你的解释是错误的

true && false -> false

false || true -> true

预计打印 “是”

0

if(true && false || true) ==>if(false || true) ==>if(true)


真值表:

F & F = F 
T & F = F 
F & T = F 
T & T = T 

OR真值表:

F | F = F 
T | F = T 
F | T = T 
T | T = T 
0

仔细看,因为这些短路 AND和OR

所以第一部分:

true&&false // evaluates to false 

然后,你必须:

false || true 

第一部分是假的,但第二部分可能是真的(事实上它是),从而将其移动到检查第二部分,认为这是真的,所以返回true

0

如果你改变你的表现,你可以看到它更加清晰,例如:

if(true || true && false) { 
    System.out.println("yes"); 
} else { 
    System.out.println("no"); 
} 

如果&&优先,你有(true || (true && false))这将是真实的,所以会打印“是”。

如果||需要precence你将有((true || true) && false)这将是错误的,并会打印出“没有。

如果你运行上面的代码,你会看到的结果是‘是’,&&具有precendence。

0

的& &首先计算......但一侧的“或” ||为真,那么整个表达式的计算结果为“真”

if(true&&false||true) 
{ 
    System.out.println("yes"); 
}