黑马程序员技术交流社区

标题: Java学习过程中的十大谜题系列-----表达式谜题 [打印本页]

作者: bobo2017    时间: 2017-10-10 14:43
标题: Java学习过程中的十大谜题系列-----表达式谜题
        基础班学习也进行了大半个月了,学完自己结合网络上资料整理了部分在Java基础阶段比较难以发现的谜题,为和大家一起交流学习因此准备写这个Java基础谜题系列,望大神们不吝指教共同进步!
        第一个谜题: 奇数之谜
        在基础班第二节课就练习了求一个数的是否为奇数?正常判断是否为奇数的代码是:
[AppleScript] 纯文本查看 复制代码
int  a=7;
boolean b=(a%2==0);

上述代码b的值是true,而我将代码改成下面代码:
[AppleScript] 纯文本查看 复制代码
int a =-1;
boolean b = (a%2==1)

很明显 a是奇数,但是这段代码执行结果却出人意料,b返回false.百思不得其解,我在网上查了好多资料最后发现问题出在取模的符号%上,在Java里取模操作符%被定义为对所有int数值a和所有非零int数值b,都满足下面的表达式
[AppleScript] 纯文本查看 复制代码
(a/b)*b+(a%b) ==a

也就是说,如果你要用a整出b,将商乘以b,然后在加上余数,应该得到最初的值a.该等式应该恒成立,这就意味着在取模操作返回非零结果时,它和左操作符具有相同的正负符号.
因此当上面我给a=-1时,对2取模结果是-1,很明显-1是奇数但是等式 -1==1显然不成立,这就产生一个悖论.我们都学过数学的显然上面程序不能正确得到结果.因此建议在判断奇偶性时注意使用课堂上老师的方法a%2==0和a%2!=0.
上面的例子我们也许对取模运算符有了一定的了解,那么问题来了,上面只是求奇偶性,而新问题是我要求-100到100 之间对5取模个位是7的数(对10取模是7的数) 我写的代码如下大家思考一下是否正确:
[AppleScript] 纯文本查看 复制代码
for(int i=-100 ; i <=100;i++){
if(i%10==7)
{System.out.print(i+" ");}
}

都是一个字一个字敲出来的还望大家指教>
作者: bobo2017    时间: 2017-10-10 15:12
后续会继续更新希望大家批评指导




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2