java与C++中的后置自增操作符++
2011-11-08 17:25
92 查看
在前置自增与后置自增操作中,当属后者最为麻烦。
某书中有一道简单的题目
如下几行 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++并没有提供这方面的保证,这是一个令人惊讶的现实)
某书中有一道简单的题目
如下几行 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++并没有提供这方面的保证,这是一个令人惊讶的现实)
相关文章推荐
- (编程语言中)后置++(即i++),分别通过汇编和字节码分析其在vs2012 C++和java中区别
- Java程序员看C++代码
- C++与Java之括号匹配(栈实现)
- coocs2d-x中c++与java互相传值(数组)
- 关于java和c++中 i=i++结果不同的分析
- [2014.1.31] Eclipse、MinGW、JNI编写C++生成dll, Java端调用的完整示例(附java.lang.UnsatisfiedLinkError解决方法)
- LeetCode 100 — Same Tree(C++ Java Python)
- java中的引用和C++中的指针的区别
- 从C++转到Java 如何把握关键
- C++与Java比较
- java读取C++里的文件,C++的long用java怎么读取。负数的转变
- [LeetCode] 022. Generate Parentheses (Medium) (C++/Java/Python)
- [LeetCode] 023. Merge k Sorted Lists (Hard) (C++/Java/Python)
- C++及java静态代码审查
- java从头开始学习到选择c++ (三)控制语句需要注意的地方
- 我能读懂C++和Java但是读不懂Smalltalk
- dijkstra队列优化链式前向星(C++、Java)
- 【C/C++开发】【Java开发】JNI的替代者—使用JNA访问Java外部功能接口
- 初次涉及Java领域,感觉到Java入门是好像没有C,C++入门快
- JNI基础java、C++交互