我一直坚持的部分是
boolean(0 % 2 !=0)
== false。我的意思是如果2进入0,0次然后余数将是2,而2不等于0.所以它应该是真的。然而,当我把boolean放在我的java程序中时,它将它视为false。谁知道为什么?
我可以解决的唯一合乎逻辑的答案是整数可能会进入0且无限次,因此被认为是假的,有人吗?
答案 0 :(得分:26)
有两个步骤:
0 % 2
评估为0
。
0 != 0
评估为false
。
详细说明第一步,JLS defines %
运算符如下:
二进制%运算符据说从隐含的除法中产生其余的操作数;左手操作数是被除数,右手操作数是除数。
0
除以2
之外的其余部分为0
,而不是2
。您似乎认为。
答案 1 :(得分:3)
%
返回除法后的余数。零除以任何东西(除了它本身!)为零,因此没有余数。
因此0 % 2
为0
。
答案 2 :(得分:3)
0%2 = 0,因为0/2 = 0且提醒0,或0 * 2 +提醒= 0。
你只是误解了模数。
答案 3 :(得分:1)
我认为你混淆0%2和2%0(这是不可能的)。 0%n始终等于0.
好的,让我们剖析......
1)0 % 2
模数是有限除法的其余部分。例如,10%3是10/3的剩余部分。 10/3是3 +⅓。剩下的就是1。
0%2是0/2的剩余部分。 0/2 = 0,没有休息,因此0%2 = 0。
2)0 % 2 != 0
这意味着0%2不同于0.我们现在知道它是假的。
3)boolean(0 % 2 != 0)
这只是演员。您将结果转换为布尔值。它不仅仅是一些错误的假设,而是获得Java值false
。
4)boolean(0 % 2 != 0) == false
==
表示此处有测试。测试可以简化(如上所示)为false == false
。 false
是否等于false
?是的。结果是true
。
答案 4 :(得分:0)
如果2进入0,0次,则余数为2。
它不是2 goes into 0
而是0 goes into 2
,所以devision的结果为0,提醒为0。
答案 5 :(得分:0)
它与Operator Precedence有关,也就是Java解释器评估运算符的顺序。
有关文档,请参阅here。一个有用的首字母缩写是BUDMASRELCA - B 球拍, U nary, D iv- M ultiplication(实际上是乘法的,因为它包括modulo), A ddittion- S ubtraction, R elational, E 质量, L 强> ogical,<强> C 强>条件型(三元),的 A 强> ssignment。 我错过了Bitwise运算符,但它们可以归入Logical,它们优先于普通的逻辑运算符。
首先将0%2!= 0评估为0%2(乘法),然后使用!= 0评估其结果0(相等)
在内部,编译器构建一个二进制表达式树来表示如下所示的顺序,使用运算符作为根和叶作为值或其他运算符(在递归情况下)。因此,需要先评估具有运算符的子树,然后才能使用它的值来评估根运算符。
!=
/ \
% 0
/\
0 2