Puzzle 25: Inclement Increment

下面这段代码的执行结果是?

        int j = 0;
        for (int i = 0; i < 100; i++) {
            j = j++;
        }
        System.out.println(j);

出人意外的是,居然是0. j = j++ 这句执行了100次,但最后 j 还是 0. 看起来不可思议,但其实这是 JLS 的规定所致,参 JLS 15.14.2 的说法:The value of the postfix increment expression is the value of the variable before the new value is stored(意译:后++表达式的值,是执行++操作之前的值). 而这个 j = j++,其实是把表达式的值的赋值给 j,表达式的值又是执行 ++之前的值,即0. 这么说,j = j++ 这句相当于执行下面的序列:

int tmp = j;
j += 1;
j = tmp; // j++ 这个表达式的值是执行++操作之前的值,所以要把 tmp 的值赋给它

这个例子的教训据说和《Puzzle 7 位交换操作失败》一样,都是:不要在一句话中对一个变量进行两次或多次赋值,否则易出现不可思议的后果。

参考代码:http://code.google.com/p/cyiridiumsitewikineed/source/browse/trunk/src/javapuzzlers/book/javapuzzlers/ch04/p25/Increment.java