文章目录

  1. 1. 无情的增量
    1. 1.1. 分析
    2. 1.2. 类似的问题
    3. 1.3. 建议
  2. 2. 变幻莫测的i值
    1. 2.1. 分析
    2. 2.2. 建议

摘自《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类数值。

建议

如果可能的话,移位长度应该是常量。

(完)

微信公众号

文章目录

  1. 1. 无情的增量
    1. 1.1. 分析
    2. 1.2. 类似的问题
    3. 1.3. 建议
  2. 2. 变幻莫测的i值
    1. 2.1. 分析
    2. 2.2. 建议