c语言前置 和后置 是啥运算符,(转)前置++跟后置++的区别

2023-11-08

(转)前置++和后置++的区别

今天在阅读《google c++ 编程风格》的文档的时候,5.10. 前置自增和自减:有一句话引起了我的注意:

对于迭代器和其他模板对象使用前缀形式 (++i) 的自增, 自减运算符.,理由是 前置自增 (++i) 通常要比后置自增 (i++) 效率更高。于是我查了查前置++和后置++的区别。

注意:《more effective c++》条款8也专门叙述了问题。后来我发现,下面的文章基本就是它的翻版,哈哈

前置++和后置++的区别

《C专家编程》中有如下描述(P276,人民邮电出版社):

++a表示取a的地址,增加它的内容,然后把值放在寄存器中;

a++表示取a的地址,把它的值装入寄存器,然后增加内存中的a的值;(也就是说操作的时候用到的都是寄存器里面的值,即自增前的值)

另外,网上找了篇文章,通过从运算符重载的角度来探讨他们的不同,如下:

假设有一个类Age,描述年龄。该类重载了前置++和后置++两个操作符,以实现对年龄的自增。

classAge

{public:

Age& operator++() //前置++

{++i;return *this;

}const Age operator++(int) //后置++

{

Age tmp= *this;++(*this); //利用前置++

returntmp;

}

Age& operator=(int i) //赋值操作

{this->i =i;return *this;

}private:inti;

};

从上述代码,我们可以看出前置++和后置++,有3点不同:

返回类型不同

形参不同

代码不同

效率不同

返回值类型的区别

前置++的返回类型是Age&,后置++的返回类型const Age。这意味着,前置++返回的是左值,后置++返回的是右值。(关于左值和右值的讨论很多,见本文下面)

左值和右值,决定了前置++和后置++的用法。

intmain()

{

Age a;

(a++)++; //编译错误

++(a++); //编译错误

a++ = 1; //编译错误

(++a)++; //OK

++(++a); //OK

++a = 1; //OK

}

++的类型是const Age,自然不能对它进行前置++、后置++、赋值等操作。

++a的类型是Age&,当然可以对它进行前置++、后置++、赋值等操作

a++的返回类型为什么要是const对象呢?

有两个原因:

如果不是const对象,a(++)++这样的表达式就可以通过编译。但是,其效果却违反了我们的直觉 。a其实只增加了1,因为第二次自增作用在一个临时对象上。

另外,对于内置类型,(i++)++这样的表达式是不能通过编译的。自定义类型的操作符重载,应该与内置类型保持行为一致 。

a++的返回类型如果改成非const对象,肯定能通过编译,但是我们最好不要这样做。

++a的返回类型为什么是引用呢?

这样做的原因应该就是:与内置类型的行为保持一致。前置++返回的总是被自增的对象本身。因此,++(++a)的效果就是a被自增两次。

形参的区别

前置++没有形参,而后置++有一个int形参,但是该形参也没有被用到。很奇怪,难道有什么特殊的用意?

其实也没有特殊的用意,只是为了绕过语法的限制。

前置++与后置++的操作符重载函数,函数原型必须不同。否则就违反了“重载函数必须拥有不同的函数原型”的语法规定。

虽然前置++与后置++的返回类型不同,但是返回类型不属于函数原型。为了绕过语法限制,只好给后置++增加了一个int形参。

原因就是这么简单,真的没其他特殊用意。其实,给前置++增加形参也可以;增加一个double形参而不是int形参,也可以。只是,当时就这么决定了。

代码实现的区别

前置++的实现比较简单,自增之后,将*this返回即可。需要注意的是,一定要返回*this。

后置++的实现稍微麻烦一些。因为要返回自增之前的对象,所以先将对象拷贝一份,再进行自增,最后返回那个拷贝。

在Age的代码中,后置++利用了前置++来实现自增。这样做是为了避免“自增的代码”重复。

在本例中,自增的代码很简单,就是一行++i,没有必要这样做。但是在其它自增逻辑复杂的例子中,这么做还是很有必要的。

效率的区别

如果不需要返回自增之前的值,那么前置++和后置++的计算效果都一样。但是,我们仍然应该优先使用前置++,尤其是对于用户自定义类型的自增操作。

前置++的效率更高,理由是:后置++会生成临时对象。

从Age的后置++的代码实现也可以看出这一点。

const Age operator++(int) //后置++

{

Age tmp= *this;++(*this); //利用前置++

returntmp;

}

很明显,tmp是一个临时对象,会造成一次构造函数和一次析构函数的额外开销。虽然,编译器在某些情况下可以优化掉这些开销。但是,我们最好不要依赖编译器的行为。

所以,在非内置类型的时候,尽量使用前置++,因为效率高(后置自增,效率低)

原文链接:http://blog.csdn.net/randyjiawenjie/article/details/6747720

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

c语言前置 和后置 是啥运算符,(转)前置++跟后置++的区别 的相关文章

  • 华为OD机试真题- 组合出合法最小数【2023Q1】【JAVA、Python、C++】

    题目描述 给一个数组 数组里面都是代表非负整数的字符串 将数组里所有的数值排列组合拼接起来组成一个数字 输出拼接成的最小的数字 输入描述 一个数组 数组不为空 数组里面都是代表非负整数的字符串 可以是0开头 例如 13 045 09 56
  • 哇塞,可以用Python实现电脑自动写小说了!!!

    作家 是多么一个让人感到向往的职业 我也幻想着 有一天能够靠写小说赚稿费 来实现自己的另一份可靠的收入 可惜 理想是美好的 但现实很残酷 不管怎么写 都不能赶上其他作者 自己至今仍然是一个扑街写手 我自知我的水平是真的不能冠以作家的称号 因
  • 【简单工具】BurpSuite截获请求并生成文件

    目录 1 实验目标 2 实验环境及靶机设置 2 1 实验环境 2 2 靶机设置 3 实验过程 3 1 前期准备 3 2 BurpSuite设置与操作 3 3 查看结果 4 总结 1 实验目标 设置BurpSuite为浏览器代理 拦截浏览器的
  • Django-登录demo

    本demo的登陆逻辑 如果账号密码正确 跳转至百度页面 账号密码错误 提示登录失败 正确的 账号 admin 密码 123 1 views下添加一个login方法 2 urls中去绑定一下 3 创建一个login xml 运行一下
  • AD18导入的3D模型颜色是白色解决

    问题描述 从Solidworks导入AD18的step文件 显示为白色 解决方法 Solidworks中保存step文件时选AP214格式 不要选择AP203 建议 重新导出时建议起一个和上一次不一样的名字 不然重新导入AD依然是白色 效果
  • Unity自带IAP插件使用

    Unity Services里的Unity IAP对于IOS和GooglePlay的支付用这个插件就足够了 Unity官方文档 1 集成插件 Window Services Ctrl 0 在Services面板Link你的工程 启用In A
  • 抽象问题方法论

    文章目录 模型简化 问题分解到base 流式处理 只关心当前节点问题 从设计者角度出发 思考问题 前后逻辑串联 穷举 细节是魔鬼 基础无穷尽 更高的秩序意味着更先进的文明 设计要小而美 而不是大而全 升维 降维 基于以上逻辑 需要做熵减行为
  • uniapp小程序

    uniapp小程序 uni app之响应式单位upx和rpx upx rpx简介 upx 1 动态绑定的 style 不支持直接使用 upx 2 使用 uni upx2px Number 转换为 px 后再赋值 rpx responsive
  • 华为OD机试 - N进制减法(Java)

    题目描述 主管期望你实现一个基于字符串的N进制的减法 需要对输入的两个字符串按照给定的N进制进行减法操作 输出正负符号和表示结果的字符串 输入描述 输入有三个参数 第一个参数是整数形式的进制N值 N值范围为大于等于2 小于等于35 第二个参
  • 【视频篇】创作的基石,如何找素材?

    前言 工作学习中免不了要搜集素材 然后进行二次创作 这些素材从哪来呢 别告诉我你还在直接百度之后慢慢翻 针对如何找素材 我在打算做一个专题分享一下我的 路子 常见的素材类型比如图片 视频 字体 海报模板 PPT模板等等 想到什么写什么吧 这
  • 一个人如何做抖音矩阵

    随着抖音发展的越来越成熟 不少企业 公司都开始在抖音上发力 但由于人员不够迟迟没有开始布局抖音矩阵 今天小编就来和大家聊一聊一个人怎么做抖音矩阵 一个人做抖音矩阵其实也非常简单 只需要借助矩阵管理系统即可 很多小伙伴迟迟没有做抖音矩阵营销的
  • python 字符串截取_python字符串截取、查找、分割

    Python 截取字符串使用 变量 头下标 尾下标 就可以截取相应的字符串 其中下标是从0开始算起 可以是正数或负数 下标可以为空表示取到头或尾 例1 字符串截取 str 12345678 print str 0 1 gt gt 1 输出s
  • QT 控件重绘

    前言 转载请附上连接 本帖原创请勿照抄 QT重绘控件是指通过实现控件头文件 使用QSS或者样式表来对某个控件进行重新绘制 1 重绘QButton按钮 2 重绘QComboBox下拉框 3 其它控件重绘的办法 1 重绘QButton 重绘控件
  • 竞赛选题 基于机器视觉的二维码识别检测 - opencv 二维码 识别检测 机器视觉

    文章目录 0 简介 1 二维码检测 2 算法实现流程 3 特征提取 4 特征分类 5 后处理 6 代码实现 5 最后 0 简介 优质竞赛项目系列 今天要分享的是 基于机器学习的二维码识别检测 opencv 二维码 识别检测 机器视觉 该项目
  • 深度学习手记(七)之MNIST实现CNN模型

    手写字体识别是一个很好练习CNN框架搭建的数据集 下面简单讲述一下整个模型构建的思路 整个模型通过两次卷积 两次亚采样以及两次全连接层 整个结构比较简单 也易理解 其中 两次卷积层的大小都为5x5 过滤器分别为32和64个 为了不改变图片的
  • 【Docker】Docker 如何在容器内安装vi命令(vi不能使用)

    文章目录 1 背景 1 背景 mac下安装了docker 然后用docker 安装了grafana软件 然后进入grafana base lcc lcc prometheus docker exec it 4b5f517f4340 bash
  • 火车进站

    import java util 火车进站 1 先求出所有可能的出栈序列 不一定合法 2 判断出栈序列是否合法 3 对合法的出栈序列进行排序后输出 public class solution private static List
  • 密码学哈希函数

    哈希函数H使用变长数据分组M作为输入 生成定长结果h H M 这一结果也称哈希值 哈希码或散列值 好的哈希函数的特点如下 对大输入集合使用该函数时 输出是均匀分布的且是明显随机的 概括的说 哈希函数的主要目标是保证数据的完整性 在安全应用中
  • Visual Studio 2019 Community 版离线注册

    本文主要参考 https blog csdn net songfuliang2011 article details 102486451 Visual Studio 2019 Community 虽然是免费使用 但必须在线注册一个账号 否则

随机推荐

  • Spring Boot 事务详解

    自己学习事务做的笔记 方便记忆和复习 1 事务是为了解决数据安全问题而存在的 最经典的例子就是银行转账问题 A账户给B账户转账100元 A账户扣除100元后由于不可抗力因素导致程序中断 B账户没有收到那100元 A账户那100元凭空消失 肯
  • Ubuntu IDEA安装和配置以及eclipse下载

    Idea2022版本官网下载 https www jetbrains com idea download section linux sudo tar zxvf ideaIU 2022 3 3 tar gz C usr local sudo
  • 闲鱼玩法平台系列文章——双11实操篇

    背景 营销玩法是电商行业进行商品促销和用户增长的重要手段 上一篇中介绍了闲鱼的玩法平台 多啦A梦 本篇将介绍在该系统上承接的玩法 闲鱼作为闲置循环工厂也参与了大促 为了让更多闲置在闲鱼游起来 在商品侧设计了 转卖抽奖 活动玩法 为了能让更多
  • asoc 如何定义各种widget、route

    上一节中 介绍了DAPM框架中几个重要的数据结构 snd soc dapm widget snd soc dapm path snd soc dapm route 其中snd soc dapm path无需我们自己定义 它会在注册snd s
  • 大数据治理——《华为数据之道》

    重点章节 1 差异化的数据分类管理 第二章 信息架构 第三章 数据底座 第三章 次重点 2 数据服务 第四章 数据质量 第五章 数据安全与隐私 第六章 其他 3 数据感知 第五章 数据综合治理体系 第二章 企业数字化转型 第三章 重要概念和
  • 【自用】西门子s7-200连接显示屏和物联网盒子完整配置过程

    总览 1 PLC配置 2 显示屏配置 3 物联网盒子配置 一 PLC配置 1 连接PLC软件 STEP 7MicroWIN V4 0 SP9完整版 链接 https pan baidu com s 17LMEXnbkQZMPI8Bte24E
  • 使用单片机控制600W升压模块输出电压

    要想用单片机控制升降压模块的输出电压 首先想到的就是使用电信号控制FB电阻大小 原理上数字电位器可以满足这个需求 那么问题就在于 如何评估数字电位器大小 如何知道FB电阻和输出电压的关系 如果是集成DCDC变换器模块比较简单 一块板上没几个
  • QT 消息对话框按钮显示

    前言 搞QT嘛 大多数都是军工 都要国产化 而且消息对话框的按钮的英文也不是很得劲 所以需要汉化 使用静态函数的按钮就是显示英文 汉化的代码如下 void Widget on pushButton clicked QMessageBox b
  • python selenium 获取frame中的元素

    版权声明 本文为徐代龙原创文章 未经徐代龙允许不得转载 https blog csdn net xudailong blog 使用情景 在很多的视频播放网站 视频播放页面往往获取不到iframe里面的内容 也或者是模拟登陆的时候 会跳入一个
  • 标量、向量、矩阵之间求导笔记

    2019 12 06 今天 碰到了下面有关向量对于向量的导数 不太明白为什么最后得到的是A的转置 d A x
  • 区块链Fabric 排序、二次开发

    1 排序 Orderer 排序 Orderer 指对区块链网络中不同通道产生的交易进行排序 并广播给节点 Peer 排序 Orderer 是以可插拔组件的方式实现 目前分为SOLO和Kafka两种类型 SOLO 仅有一个Orderer服务节
  • React 状态管理器,我是这样选的

    前言 我们的前端团队在一直深度使用 React 从最早的 CRA 到后来切换到 umijs 从 1 x 2 x 3 x 再到现在的 4 x 其中有一点不变的 就是我们一直在使用基于 react redux 思想的 dva 作为状态管理工具
  • React hooks 不能拿到最新的的setState的值

    在class中 如果 我们想要拿到setState 最新的值 去调用api 直接通过this setState的回调函数就可以了 this setState latestValue 我是最新的 gt this callApi latestV
  • Koa项目搭建----从零搭建Koa项目

    最近发现使用 Koa 创建项目的博客比较多 但是不够细致 为方便自己和他人 遂整理本博客 本博客会介绍以下内容 1 安装Koa脚手架 即 koa generator 2 创建 Koa 1 项目 3 创建 Koa 2 项目 4 坑 5 项目运
  • 基于TypeScript的PixiJS开发环境设置(webpack篇)

    转自 http www limbonova com 2017 09 setup pixijs with typescript using webpack 前几天写了一篇用Browserify打包的 PixiJS 的开发环境配置流程 但是We
  • 一个项目所需要的各个模块以及它们对应的功能

    首先你要知道 一个项目它的目的是什么 一个项目最终要达到一个什么效果 其实说白了 一个项目实现的最终结果就是实现对数据库的增删查改 然后返回最终的视图或者数据给前端 这就是一个项目的目的 这也是最简单的说法 那要实现这个从数据库当中的增删查
  • CSP201312-1 出现次数最多的数

    include
  • Java性能优化常用命令及工具简介

    Java性能优化常用命令及工具简介 简述 1 多线程或边界情况等引起的异常 2 内存异常 3 CPU问题 总结 简述 开发中可能都会碰到程序运行越来越慢 占用内存和cpu越来越高 那如何定位问题呢 我们将问题简单分类为三个常见的场景 1 多
  • 通配符与正则表达式

    一 通配符与正则表达式的区别 通配符用来匹配文件名 正则表达式用来匹配文本 二 通配符 Shell命令中通常用通配符做文件名字或则目录名的模糊查找 2 1 表示匹配任意长度的字符 eg 在终端中输入命令 ls txt 则会显示当前路径下所有
  • c语言前置 和后置 是啥运算符,(转)前置++跟后置++的区别

    转 前置 和后置 的区别 今天在阅读 google c 编程风格 的文档的时候 5 10 前置自增和自减 有一句话引起了我的注意 对于迭代器和其他模板对象使用前缀形式 i 的自增 自减运算符 理由是 前置自增 i 通常要比后置自增 i 效率