2012-05-09 101 views
6

我一直卡在的部分是 boolean(0 % 2 !=0) == false。我的意思是如果2进入0,0次,那么剩下的将是2,而2不等于0.所以它应该是真的。但是,当我把我的Java程序中的布尔值,它被视为假。有人知道为什么`java(0%2!= 0)== false`

我可以包裹我的头的唯一合乎逻辑的答案是,也许整数进入0和无限次数,因此被认为是假的,任何人?

+0

我很积极,这不是一个编码错误,我直接从我的书中复制这个,它也在我的讲座中多次引用。 – Michael

+0

这就是......不是'%'的意思。 –

回答

24

有两个步骤:

  • 0 % 2评估为0

  • 0 != 0评估为false

为了详细说明在第一步骤中,JLS defines%操作者像这样:

二进制%操作者被说成从一个隐含的除法得到其操作数的剩余部分;左边的操作数是红利,右边的操作数是除数。

的划分0通过2的其余部分0和你似乎认为不2

+5

我通常不会+1真正基本的东西,但出于一些奇怪的原因,这个让我发笑。 – Mysticial

2

%返回除法后的余数。除以任何东西(本身除外!)为零,所以没有余数。因此0 % 20

+4

零除以任何东西*除零*为零 – aioobe

+0

这个现代数学是如此莫名其妙:-) –

+0

哈哈,很好的捕捉:)修正! –

4

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

你只是误解模量。

0

如果2进入0,0次,然后剩余部分将是2.

它不是2 goes into 00 goes into 2,所以等分的结果为0,并且该提醒是0。

+1

你的意思是“分裂”和“剩余”......(提醒是你在Postit纸条上写的,而devision不是英语单词......虽然它可能是一种中世纪折磨形式的委婉说法。 “这个囚犯被带到了地下城,并被一把红热的扑克”剔除“了。) –

1

我想你混合了0%2和2%0(这是不可能的)。 0%n是始终等于0

OK,让我们剖析该...

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)​​

==意味着有一个测试在这里。测试可以简化(如上所示)为false == false。是false等于false?是的。结果是true

0

它与运算符优先级有关,也就是Java解释器对运算符进行评估的顺序。

查看here的文档。一种有用的缩写,是BUDMASRELCA - 球拍,ü进制,d IV- 中号 ultiplication(实际上乘法因为它包括模), ddittion- 小号 ubtraction,ř elational,E quality,L ogical,C传统(三元),A调整。 我错过了按位运算符,但它们可以分组在逻辑下,它们优先于正常的逻辑运算符。

0%2!= 0为0%评价2(乘法)第一和然后它的结果0与!= 0。(平等)

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

!= 
/\ 
% 0 
/\ 
0 2 
相关问题