8

我一直坚持的部分是 boolean(0 % 2 !=0) == false。我的意思是如果 2 进入 0、0 次,那么余数就是 2,并且 2 不等于 0。所以它应该是真的。但是,当我将布尔值放入我的 java 程序中时,它会将其视为错误。有谁知道为什么?

我能想到的唯一合乎逻辑的答案是,整数可能会进入 0 和无限次,因此被认为是错误的,有人吗?

4

6 回答 6

30

有两个步骤:

  • 0 % 2评估为0

  • 0 != 0评估为false

为了详细说明第一步,JLS定义%这样的操作符:

据说二进制 % 运算符从隐含的除法中产生其操作数的其余部分;左边的操作数是被除数,右边的操作数是除数。

除以的其余部分020不是2您似乎认为的那样。

于 2012-05-09T06:58:37.053 回答
4

%返回除法后的余数。零除以任何东西(除了它自己!)是零,所以没有余数。

因此0 % 20

于 2012-05-09T06:59:47.490 回答
3

0%2 = 0,因为 0/2 = 0 和提醒 0,或者 0*2+提醒 = 0。

你只是误解了模数。

于 2012-05-09T07:05:25.483 回答
1

我认为你混淆了 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 == falsefalse等于false? _ 是的。结果是true

于 2012-05-09T07:06:30.770 回答
1

它与运算符优先级有关,即 Java 解释器评估运算符的顺序。

有关文档,请参见此处。一个有用的首字母缩写词是 BUDMASRELCA - B球拍、元、D iv-乘法(实际上是乘法,因为它包括模数)、A ddittion-减法、R elational 、E质量、L ogical、C条件(三元)、A分配。我错过了按位运算符,但它们可以归类在逻辑下,并且它们优先于普通逻辑运算符。

0 % 2 !=0 首先被评估为 0%2(乘法),然后它的结果 0 被评估为 != 0。(平等)

在内部,编译器构建一个二叉表达式树来表示如下所示的顺序,使用运算符作为根,使用叶作为值或进一步的运算符(在递归情况下)。因此,需要先评估具有运算符的子树,然后才能使用其叶子的值评估根运算符。

  !=
 / \
%   0
/\
0  2
于 2016-07-02T18:10:28.913 回答
0

如果 2 进入 0, 0 次,则余数为 2。

不是2 goes into 0but 0 goes into 2,所以 devision 的结果是 0,reminder 是 0。

于 2012-05-09T07:05:39.217 回答