在前置自增与后置自增操作中,当属后者最为麻烦。
某书中有一道简单的题目
如下几行 Java 代码:
import java.util.*;
public class Text{
public static void main(String[] args){
int j = 0;
for(int i = 0; i < 100; i++)
j = j++;
System.out.println(j);
}
}
执行结果是多少? 我当时写了两个答案:0,100.
第一个答案:0 是因为对于后置++
caozuofu.html" target="_blank">操作符,号称用了中间
缓存变量机制,其实内部实现大致如下
temp = j;
j = j + 1;
j = temp;
第二个答案:100,
为什么呢?请看以下一段C++代码
#include <iostream>
using namespace std;
int main()
{
int j = 0;
for(int i = 0; i < 100; i++)
j = j++;
cout << j << endl;
return 0;
}
结果是就是100。
难道C++就没有中间缓存变量机制?当然不是。
导致Java和C++在这方面的区别的原因不在机制本身,而在于编译器的问题。在C++中,后置自增同样会比前置自增多了一份中间缓存的工作。但是请注意,在C++中,一些基本类型如int,double以及指针类型,在进行后置自增操作的时候,编译器将会为这些类型省去中间缓存变量的操作,采取其它方式(我猜是直接按照优先级拆分代码)。
所以在这方面,Java与C++显得有点不同,或者性能与C++显得不足。我是这样评估的,在Java中前置自增的性能总是要比后置自增性能要好(没有缓存变量赋值);C++中大部分也是这样,但是如果是对基本类型和指针进行后置自增操作,那么性能将和前置自增一样。
但是一般不建议在复合语句中使用后置自增,尽量用前置自增。因为在后置自增中,C++只保证自增在所在语句执行后进行自增,却没有保证在什么时候自增(虽然几乎所有的都是在当前语句执行完之后马上自增,但是据我所知,C++并没有提供这方面的保证,这是一个令人惊讶的现实)