`
tuojian.tj
  • 浏览: 19279 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

java与C++中的后置自增操作符++

阅读更多
在前置自增与后置自增操作中,当属后者最为麻烦。

某书中有一道简单的题目
如下几行 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 是因为对于后置++操作符,号称用了中间缓存变量机制,其实内部实现大致如下
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++并没有提供这方面的保证,这是一个令人惊讶的现实)
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics