关于JAVA谜题畅读的进一步理解

在研究前几天转载的JAVA谜题时调试

谜题25:无情的增量操作的理解:

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);
}
}
这个问题时,对调试结果极为的不理解。


通过查阅资料得到以下结论:


程序第一次循环时的详细处理步骤如下:
步骤 1 JVM 把 j 值(其值是 0)拷贝到临时变量区。
步骤 2 j 值加 1,这时候 j 的值是 1。
步骤 3 返回临时变量区的值,注意这个值是 0,没修改过。
步骤 4 返回值赋值给 j,此时 j 值被重置成 0。

此例中代码作者的本意是希望 count 自增, 所以想当然地认为赋值给自身就成了, 不
曾 想 掉 到 Java 自 增 的 陷 阱 中 了。 解 决 方 法 很 简 单, 只 要 把“j=j++” 修 改 为
“j++” 即 可。 该 问 题 在 不 同 的 语 言 环 境 有 不 同 的 实 现 :C++ 中“j=j++” 与
“j++” 是等效的, 而在 PHP 中则保持着与 Java 相同的处理方式。

谜题27:变幻莫测的i值的理解:

移位运算符就是在二进制的基础上对数字进行平移。按照平移的方向和填充数字的规则分为三种:<<(左移)、>>(带符号右移)和>>>(无符号右移)。  

 在移位运算时,byte、short和char类型移位后的结果会变成int类型,对于byte、short、char和int进行移位时,规定实际移动的次数是移动次数和32的余数,也就是移位33次和移位1次得到的结果相同。移动long型的数值时,规定实际移动的次数是移动次数和64的余数,也就是移动66次和移动2次得到的结果相同。

386 以后的硬件把移位对字长进行取模,右移32位就是右移了0位(CPU 把右移的位数 32 对于字长 32 进行取模运算,得到 0),因此 9 右移 32 位仍然是 9。你可以换一下for循环的条件,比如换成i<=64,你会发现结果是一样的。




从这里看出越是基础的东西,越是需要搞明白原理。

你可能感兴趣的:(关于JAVA谜题畅读的进一步理解)