Java 解惑知多少二
8. +=复合赋值问题
8. +=复合赋值问题
x+=i与x=x+i等效吗,许多程序员都会认为第一个表达式x+=i只是第二个表达式x=x+i的简写方式,但这并不准确。
Java语言规范中提到:复合赋值 E1 op= E2等价于简单赋值 E1 = (T)((E1) op (E2)),其中T是E1的类型。
复合赋值表达式自动地将所执行计算的结果转型为其左侧变量的类型。如果结果的类型与该变量的类型相同,那么这
个转型不会造成任何影响,然而,如果结果的类型比该变量的类型要宽,那么复合赋值操作符将悄悄地执行一个窄化
原生类型转换,这样就会导致结果不正确:
10. Integer.MAX_VALUE + 1=?
13. 自己不等于自己吗?i!=i
NaN(Not a Number)不等于任何数,包括它自身在内。
double i = 0.0/0.0;可表示NaN。
float和double类型都有一个特殊的NaN值,Double.NaN、Float.NaN表示NaN。
如果一个表达式中产生了NaN,则结果为NaN。
14. 自动拆箱System.out.println(Math.abs(Integer.MIN_VALUE));// -2147483648
上面的程序不会输出2147483648,而是-2147483648,为什么?
其实我们看一下Math.abs源码就知道为什么了,源码:(a < 0) ? -a : a;,结合上面那个迷题,我们就发现-Integer.MIN_VALUE= Integer.MIN_VALUE,所以上面的答案就是最小整数自己。
另外我们也可以从API文档看到对Math.abs()方法的解释:如果参数等于 Integer.MIN_VALUE 的值(即能够表示的最
小负 int 值),则结果与该值相同且为负。
所以Math.abs不能保证一定会返回非负结果。
当然,Long.MIN_VALUE也是这样的。
参考:http://jiangzhengjun.iteye.com/blog/652639