在前置自增与后置自增操作中,当属后者最为麻烦。
某书中有一道简单的题目
如下几行 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)通常要比后置自增(i++)效率更高,因为后置的自增自减需要对表达式的值i 进行一次拷贝,如果i 是迭代器或其他非数值类型,拷贝的代价是比较大的。 总之保持编程代码一直风格,...
本篇文章是对C++中输出指针自增(++)运算的示例进行了详细的分析介绍,需要的朋友参考下
通过实际例子对C++中的自增自减操作符进行了细致的剖析
ACM在线评测系统,可以支持C、C++和Java+Struts2 + Spring + Hibernate+课程设计+毕业设计 ACM在线评测系统,可以支持C、C++和Java+Struts2 + Spring + Hibernate+课程设计+毕业设计 ACM在线评测系统,可以支持C、...
后置自增操作符 后置自减操作符 (a + b) / 4; array[4] = 2; ptr->age = 34; obj.age = 34; Class::age = 2; for( i = 0; i ; i++ ) ... for( i = 10; i > 0; i-- ) ... 从左到右 2 ! ~ ++ -- - + * & (type) sizeof...
最全面试笔试整合(+C++C+++Java+C#+等),微软,谷歌等大型公司笔试题
C++、JAVA+、C+++、软件测试面试题C++、JAVA+、C+++、软件测试面试题
为了区分所重载的是前置运算符还是后置运算符,C++规定: 前置运算符作为一元运算符重载,重载为成员函数的格式如下: T & operator++(); // 前置自增运算符的重载函数,函数参数是空 T & operator--(); // 前置自...
本文主要写了前置++ -- 与后置++ --在程序中的应用,让C/C++学习者能够清楚了解前置++ -- 与后置++ --的用法
C++实现opencv+yolo+tensorflow+deepsort检测,网上都是python的,用c++重写的,库全部配置好,需要cuda9.0,cudnn7,tensorflow使用的1.12.0gpu,已在工程中配置好。下载即用。文件太大,已记录百度云链接,资源有...
本文给大家分享了C++ 中重载 + 操作符的正确方法。
java c++ socket java c++ socket java c++ socket java c++ socket java c++ socket java c++ socket java c++ socket java c++ socket java c++ socket java c++ socket java c++ socket
Java转C++代码工具 J2C
包含C++的算术操作符,关系操作符,下标操作符,自增操作符和自减操作符
C++编程思想(Think in C++)完整版【中文+PDF+文字】 作为老手,C++编程思想(Think in C++)我都看了两遍了,不多说了,C++编程思想(Think in C++)非常适合C++初学者,也适合有经验的程序员!
SP++ (Signal Processing in C++) 是一个关于信号处理与数值计算的开源C++程序库,该库提供了信号处理与数值计算中常用算法的C++实现
C++ test 6.7X Insure++ 7X 的注册机哟 有些说下载了用不起。经本人测试,完全可以用。软件从国内官方下载 华唐产品http://www.superst.com.cn/ 要下6.7的版本,要注册个用户才能下载。cpptest_win32_6.7.13.0.exe ...