我一直坚持的部分是
boolean(0 % 2 !=0)
== false。我的意思是如果 2 进入 0、0 次,那么余数就是 2,并且 2 不等于 0。所以它应该是真的。但是,当我将布尔值放入我的 java 程序中时,它会将其视为错误。有谁知道为什么?
我能想到的唯一合乎逻辑的答案是,整数可能会进入 0 和无限次,因此被认为是错误的,有人吗?
有两个步骤:
0 % 2
评估为0
。
0 != 0
评估为false
。
为了详细说明第一步,JLS定义了%
这样的操作符:
据说二进制 % 运算符从隐含的除法中产生其操作数的其余部分;左边的操作数是被除数,右边的操作数是除数。
除以的其余部分0
是2
而0
不是2
您似乎认为的那样。
%
返回除法后的余数。零除以任何东西(除了它自己!)是零,所以没有余数。
因此0 % 2
是0
。
0%2 = 0,因为 0/2 = 0 和提醒 0,或者 0*2+提醒 = 0。
你只是误解了模数。
我认为你混淆了 0%2 和 2%0 (这是不可能的)。0%n 始终等于 0。
好吧,让我们剖析一下……</p>
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
。
它与运算符优先级有关,即 Java 解释器评估运算符的顺序。
有关文档,请参见此处。一个有用的首字母缩写词是 BUDMASRELCA - B球拍、一元、D iv-乘法(实际上是乘法,因为它包括模数)、A ddittion-减法、R elational 、E质量、L ogical、C条件(三元)、A分配。我错过了按位运算符,但它们可以归类在逻辑下,并且它们优先于普通逻辑运算符。
0 % 2 !=0 首先被评估为 0%2(乘法),然后它的结果 0 被评估为 != 0。(平等)
在内部,编译器构建一个二叉表达式树来表示如下所示的顺序,使用运算符作为根,使用叶作为值或进一步的运算符(在递归情况下)。因此,需要先评估具有运算符的子树,然后才能使用其叶子的值评估根运算符。
!=
/ \
% 0
/\
0 2
如果 2 进入 0, 0 次,则余数为 2。
不是2 goes into 0
but 0 goes into 2
,所以 devision 的结果是 0,reminder 是 0。