Java陷阱(三)
欢迎来到阿八个人博客网站。本 阿八个人博客 网站提供最新的站长新闻,各种互联网资讯。 喜欢本站的朋友可以收藏本站,或者加QQ:我们大家一起来交流技术! URL链接:https://www.abboke.com/xwzhj/2019/0611/377.html
摘自《Java解惑》。这些问题都很经典,可以细细品味。
今天讲解的问题如下,无情的增量、变幻莫测的i值。
无情的增量
public class Increment { public static void main(String[] args) { int j = 0; for(int i = 0; i < 100; i++) { j= j++; } System.out.println(j); } }
分析
当++操作符被置于一个变量值之后时,其作用就是一个后缀增量操作符,表达式j++的值等于j在执行增量操作之前的初始值。因此,前面提到的赋值语句首先保存j的值,然后将j设置为其值加1,最后将j复位到它的初始值。换句话说,这个赋值操作等价于下面的语句序列:
int temp = j; j = j + 1; j = temp;
类似的问题
public class Demo { public static void main(String[] args) { int j = 0; j= j++; System.out.println(j); } }
建议
不要在单个的表达式中对相同的变量赋值超过一次。
变幻莫测的i值
public class Shifty { public static void main(String[] args) { int i = 0; while(-1 << i != 0) i++; System.out.println(i); } }
分析
常量-1是所有32位都被置位的int数值(0xffffffff)。左移操作符将0移入到由移位所空出的右边的最低位,因此表达式(-1<< i)将i最右边的位设置为0,并保持其余的32 -i位为1。很明显,这个循环将完成32次迭代,因为-1<< i对任何小于32的i来说都不等于0。你可能期望终止条件测试在i等于32时返回false,从而使程序打印32,但是它打印的并不是32。实际上,它不会打印任何东西,而是进入了一个无限循环。问题在于(-1<< 32)等于-1而不是0,因为移位操作符之使用其右操作数的低5位作为移位长度。或者是低6位,如果其左操作数是一个long类数值。
建议
如果可能的话,移位长度应该是常量。