博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
也说前自增和后自增
阅读量:5104 次
发布时间:2019-06-13

本文共 1171 字,大约阅读时间需要 3 分钟。

C++为什么不叫++C?来自:

看到这个问题,觉得很有意思,回答它有助于理解前自增和后自增。

上面的帖子说得很清楚了:前自增得到的是对象执行完++之后的结果,是左值;后自增是得到对象当前值并给对象执行++,是右值。

那么现在来看这个问题:

++C:意思是得到了一个对C进行了扩充的对象(把执行自增看作就是对C进行了扩充),但是这个结果已经不是C了,那么就会有它是否还支持C的问题。

C++:意思是得到了C,并且对C进行了扩充,本身隐含了对C的完全支持,相比++C更能表示 “C++” 语言是 “C语言” 的超集事实。

 

另一个问题:当前自增和后自增都可以胜任的时候,我们如何选择呢?

比如下面的情况,MyClass 是我们自己定义的类型,当然我们重载了< 操作符和++操作符。

for( MyClass mc = oneMC; i < anotherMC; ++mc){}for( MyClass mc = oneMC; i < anotherMC; mc++) {}

如果MyClass比较复杂,其实例对象比较大,那么对于后自增来说,得到对象的当前值并给对象执行++,进而可能产生对象当前值一个副本。说可能是因为编译器可能对此作出优化。

所以,如果两者都可以用的时候,用前自增可以避免可能的对象拷贝时间开销和内存占用。

 

还有一个有趣的题

#include
using namespace std;int main(){ int i = 1; int j = ++i + ++i + ++i + ++i + ++i + ++i + ++i; cout<
<

VS2010和Gcc 4.6下面的结果是不同的,前者输出56,后者输出36

原因分析:

VS2010的编译器在进行计算的时候,先把整个表达式(++i + ++i + ++i + ++i + ++i + ++i + ++i)入栈,然后依次出栈进行计算,入栈的时候++i被执行了7遍,最后的值为8,7个8相加56. (相当于采用右结合)

Gcc 4.6的编译器没有等到整个表达式都入栈才通过依次出栈进行计算,而是根据+操作符(二元)的左结合性,++i + ++i 的结果计算出来后再向表达式的右边计算;这样表达式执行第一次+运算的时候i已经执行了两次前自增了,所以相当于3 + 3,后面类似:

3 + 3 + 4 + 5 + 6 + 7 + 8 = 36

编译器行为不统一就说明标准在这里没有明确规定。具体到这个问题,就是连续执行+操作的时候,左结合还是右结合标准没有明确规定,编译器自己选择实现方式。

 

转载于:https://www.cnblogs.com/rwang/p/3393568.html

你可能感兴趣的文章
python keyboard方法_【Python】对字典列表进行去重追加
查看>>
python 时序分析_【时序分割】2017KDD时序分割聚类TICC代码分析
查看>>
java版flashplayer下载安装_mac版flash player
查看>>
java 二维数组元素转换为空格_数组中重复的数字、二维数组中的查找、替换空格--Java知识点解析...
查看>>
java findall_从python到Java的re.findall匹配,模式 - java
查看>>
php加图片源码_php给现有的图片加文字水印代码
查看>>
php 向数据表添加数据_php向表中插入数据
查看>>
php外部,PHP 的外部变量
查看>>
php getticket,easyWechat 处理ticket以及事件推送
查看>>
java获取hive表所有字段,Hive Sql从表中动态获取空列计数
查看>>
java的find怎么使用,新手使用find()有关问题求助
查看>>
JAVA链表取得全部数据,数据结构中的链表,你知道多少?
查看>>
matlab怎么对sinx求导,用matlab程序求y=ln(sinx 1)的导数
查看>>
一阶多智能体matlab,多智能体Q学习算法设计和仿真
查看>>
php中如何导包,import导包和初始化阶段
查看>>
php实现cookie自动登录,PHP使用Cookie实现自动登陆
查看>>
php查百度收录,php检查页面是否被百度收录,可整合到后台
查看>>
matlab lte工具箱,免费试用LTE Toolbox
查看>>
matlab层次分析法运行结果,层次分析法--matlab实现
查看>>
matlab 实验6 高层绘图操作,MATLAB实验报告6高层绘图.doc
查看>>