`java(0%2!=0)=false`
我一直被卡住的部分是`java(0%2!=0)=false`,java,boolean,zero,modulus,Java,Boolean,Zero,Modulus,我一直被卡住的部分是 boolean(0%2!=0) ==错误。我的意思是如果2变成0,0次,那么余数就是2,2不等于0。所以这应该是真的。然而,当我在java程序中使用布尔值时,它将其视为false。有人知道为什么吗 我能想到的唯一合乎逻辑的答案是,整数可能会变成0和无限次,因此被认为是假的,有人吗?有两个步骤: 0%2计算结果为0 0!=0的计算结果为false 为了详细说明第一步,JLS向%操作员发送如下命令: 据说二进制%运算符从隐含除法中产生其操作数的剩余部分;左手操作数是被除数,
boolean(0%2!=0)
==错误。我的意思是如果2变成0,0次,那么余数就是2,2不等于0。所以这应该是真的。然而,当我在java程序中使用布尔值时,它将其视为false。有人知道为什么吗
我能想到的唯一合乎逻辑的答案是,整数可能会变成0和无限次,因此被认为是假的,有人吗?有两个步骤:
计算结果为0%2
0
的计算结果为0!=0
false
%
操作员发送如下命令:
据说二进制%运算符从隐含除法中产生其操作数的剩余部分;左手操作数是被除数,右手操作数是除数
用
0
除以2
的余数是0
,而不是你想象的2
。%
返回除法后的余数。零除以任何东西(除了它本身!)都是零,所以没有余数
因此
0%2
是0
0%2=0,因为0/2=0和提醒0,或者0*2+提醒=0
你只是误解了
如果2变成0,0次,那么余数就是2
不是
2进入0
,而是0进入2
,所以除法的结果是0,提示是0。我想你把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
它与运算符优先级有关,即Java解释器对运算符求值的顺序
有关文档,请参阅。一个有用的首字母缩略词是BUDMASRELCA-Brackets,Unary,Div-Mmultiplication(实际上是乘法,因为它包括模),Addition-Subtraction,Relational,Equality,L,C条件(三元),A符号。
我遗漏了按位运算符,但它们可以分组在逻辑运算符下,并且优先于普通逻辑运算符
0%2=首先将0计算为0%2(乘法),然后使用!=0(平等)
在内部,编译器构建一个二元表达式树来表示如下所示的顺序,使用操作符作为根,叶子作为值或其他操作符(在递归情况下)。因此,在使用根操作符的叶子值计算根操作符之前,需要先计算具有操作符的子树
!=
/ \
% 0
/\
0 2
我肯定这不是一个编码错误,我直接从我的书中复制了这个,它在我的讲座中也被多次引用。那是。。。不是
%
的意思。整数不是无限次地进入0,而是0次。我想在你的上一句话中,你可能会想到2/0(“0进入2无限次”)而不是0/2。我通常不知道+1是什么基本的东西,但出于某种奇怪的原因,这一点让我发笑。除零之外的任何东西都是零。现代数学是如此令人困惑:-)你是指“除”和“余数”。。。(提醒是你在便条上写的东西,devision不是一个英语单词……尽管它可能是一种中世纪酷刑的委婉说法。如“囚犯被带到地牢,用一把烧红的扑克‘设计’”。)