前置++与后置++区别 以及效率

2023-11-15

之前在杭州实习面试中科视拓时候面试官问道:前置++与后置++区别 以及效率(打破对C++的认识)
后来,寒假回来看书后才恍然大悟!

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

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

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

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

前置++的返回类型是Age&,后置++的返回类型const Age。这意味着,前置++返回的是左值,后置++返回的是右值。

上demo:

#include <iostream>
using namespace std;
class Clock {//时钟类定义
public:
    Clock(int hour = 0, int minute = 0, int second = 0);
    void showTime() const;
  //前置单目运算符重载
    Clock& operator ++ ();
  //后置单目运算符重载
    Clock operator ++ (int);
private:
    int hour, minute, second;
};

Clock::Clock(int hour, int minute, int second) {
    if (0 <= hour && hour < 24 && 0 <= minute && minute < 60
        && 0 <= second && second < 60) {
        this->hour = hour;
        this->minute = minute;
        this->second = second;
    } else
        cout << "Time error!" << endl;
}
void Clock::showTime() const {  //显示时间
    cout << hour << ":" << minute << ":" << second << endl;
}


Clock & Clock::operator ++ () {
    second++;
    if (second >= 60) {
        second -= 60;  minute++;
        if (minute >= 60) {
          minute -= 60; hour = (hour + 1) % 24;
        }
    }
    return *this;
}

Clock Clock::operator ++ (int) {
    //注意形参表中的整型参数
    Clock old = *this;
    ++(*this);  //调用前置“++”运算符
    return old;
}

int main() {
    Clock myClock(23, 59, 59);
    cout << "First time output: ";
    myClock.showTime();
    cout << "Show myClock++:    ";
    (myClock++).showTime();
    cout << "Show ++myClock:    ";
    (++myClock).showTime();
    return 0;
}

  1. 效率

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

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

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

前置++与后置++区别 以及效率 的相关文章

  • Qt 图表和数据可视化小部件

    我已经安装了 Qt 5 7 来尝试 Qt 图表和 Qt 数据可视化 但我在 Qt Designer 和 Qt Creator 中都找不到新的小部件 有什么建议我应该做什么才能让新的小部件出现在设计器中 我今天遇到了完全相同的问题 默认情况下
  • 具有相同参数类型但具有不同常量限定符的 std::vector 的转换

    问题很简单 静态转换 或其他一些转换 通常是安全的 std vector lt Foo gt to std vector lt const Foo gt 就二进制而言 我不明白为什么本机类型会有所不同 毕竟const是一种语言约束 不应影响
  • .NET 单点登录

    我一直在尝试使用 C 为 NET Web 应用程序实现 WEB SSO 服务提供程序插件 我将使用 shibboleth 身份提供商 我已经使用 OpenSAML 库为 java 应用程序实现了相同的功能 我想知道在 NET 应用程序中使用
  • .crt 部分?这个警告是什么意思?

    我最近收到此警告 VC 2010 warning LNK4210 CRT section exists there may be unhandled static initializers or terminators 我假设这是关键部分
  • NDK 应用 onDestroy 清理 - 如何 DetachCurrentThread

    因此 如果我们连接 我们必须在完成后分离线程 对吗 JNIEnv get jni env JNIEnv res JAVA VM gt GetEnv void res JNI VERSION 1 6 Using cached JavaVM J
  • 将字符串作为 PChar 从 CSharp 传递到 Delphi DLL

    我正在尝试将字符串从 C 传递到 Delphi 构建的 DLL Delphi DLL 需要 PChar 这是Delphi导出 procedure DLL Message Location PChar AIntValue integer st
  • 使用 C# 将多个音频样本混合到单个文件中

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个能够创建音频文件 mp3 或 wav 的库 NAudio http www codeple
  • ContentDialog 未与 UWP 中心对齐

    据我所知 ContentDialog的默认行为应该是使其在 PC 上居中并在移动设备上与顶部对齐 但就我而言 即使在 PC 上我也将其与顶部对齐 但我不明白发生了什么 我正在使用代码隐藏来创建它 这是我正在使用的代码片段 Creates t
  • Linq 合并列表

    我的课 public class Foo public int A get set public List
  • Visual Studio 中列表框的上移、下移按钮[重复]

    这个问题在这里已经有答案了 我正在尝试制作一个上移按钮和一个下移按钮 以移动 Microsoft Visual Studio 2012 中列表框中的选定项目 我已经在 WDF jquery winforms 和其他一些表单中看到了其他示例
  • 控制台应用程序中使用 Unicode 字符的 _tprintf

    我正在从 Unicode 构建的控制台应用程序 使用 C 和 Visual Studio 2008 执行这个简单的输出 此代码旨在在 Windows 上运行 tprintf L Some sample string n 一切正常 但是如果我
  • .NET 5 EF Core SaveChangesAsync 因错误而挂起

    尽管这个问题有很多结果 但没有一个真正给我明确的答案 每次我尝试通过 AddAsync 和 SaveChangesAsync 方法插入错误数据 例如重复的主键 时 我都会看到以下日志 执行 DbCommand 失败 15 毫秒 我还在 SQ
  • 如何让XmlReader读取C#中的属性?

    我有一个 XML Stream 其中包含以下 XML 内容
  • DataGridView 行背景颜色没有改变

    我想根据加载时的特定条件更改 DGV 行的背景颜色 即使在 Windows 窗体中也是如此 但我看不到任何 DGV 行的颜色有任何变化 谁能告诉我如何解决这个问题 private void frmSecondaryPumps Load ob
  • Type.GetInterfaces() 仅适用于声明的接口

    首先 像这样的问题有很多 也许有些OP甚至在问同样的问题 问题是这些问题的答案 无论是否接受 都没有真正回答这个问题 至少我找不到 如何确定类直接声明的接口 而不是由父级或声明的接口继承的接口 e g interface I interfa
  • 选择合适的IDE

    您会推荐使用以下哪种 IDE 语言来在 Windows 下开发涉及识别手势并与操作系统交互的项目 我将使用 OpenCV 库来执行图像处理任务 之后 我将使用 win32 API 或 NET 框架与操作系统交互 具体取决于您建议的工具 性能
  • “1个未解决的外部”C++

    我已经检查了所有文件之间的连接以及类和函数定义 但每次我尝试运行我的程序时 它都会阻止我并告诉我它有 1 个未解析的外部 该程序应该打开多个文件 一个 学生 文件和一个 成绩 文件 从中读取数据 然后使用 查询文件 来查找数据 找到查询中要
  • Xcode 7 调试器不会中断内联标头函数

    过去五年我一直在各种 C 项目中使用 Xcode 没有出现这个问题 今天 我打开了一个较旧的项目 大约 2 年前 并尝试通过在该函数中放置一个活动断点来调试头文件中的内联函数 由于某种原因 调试器不会中断此代码 但是 如果我在调用该函数的
  • 从对列表创建邻接列表类型结构

    在 C 中 我有 class Pair int val1 int val2 我有一个来自以下来源的配对列表 List
  • 实体框架代码首次日期字段创建

    我正在使用实体框架代码优先方法来创建我的数据库表 下面的代码 创建一个DATETIME数据库中的列 但我想创建一个DATE柱子 DataType DataType Date DisplayFormatAttribute ApplyForma

随机推荐

  • 三次握手、四次挥手的理解

    下面是个人对三次握手和四次挥手的理解 1 三次握手 第一次握手 客户端向服务器发起连接请求 此时要确认客户端能不能发 第二次握手 服务器收到客户端的连接请求后 会给一个应答 以及请求连接的数据包 意味着服务器收到了客户端连接的请求 以此证明
  • 企业级网络突然变得很卡解决办法

    企业网络现状 公司有两个路由 都是10M的电信 我们台式电脑都是用的外置网卡连接无线上网的 平均一个路由有50台电脑使用 可是网络一直不稳定 没有被别人蹭网 防火墙也设置了相应的ACL策略 也锁定了MAC 平时使用网络是很稳定的但是问题来了
  • games101 Lecture 9 线性插值(对三角形内部的线性插值)

    重心坐标 当 alpha beta gamma
  • SonarQube白盒静态代码专家解决方案

    中国区官网 http www safetesting cn 西安青穗 http www safetesting cn 是瑞士SonarSource公司正式授权的中国渠道商和技术服务提供商 技术服务团队有多年行业经验的业界专家 咨询顾问组成
  • bi工程师面试题_【BI 大数据分析】职业规划 之横纵拓展

    这章有以下内容展示 技术需求与更新方面 挖深后需要了解的方面有那些 关于Linux系统 它在BI大数据分析框架是用来干什么 扮演什么角色 关于SQL编写 Q1 它在BI大数据分析框架是用来干什么 扮演什么角色 Q2 什么时候要用到SQL Q
  • YOLOv5-6.x源码分析(四)---- 模型搭建之yolo.py

    文章目录 前引 YOLOv5 6 x源码分析 四 yolo py 1 导入需要的包 2 parse model 2 1 获取对应参数 2 2 搭建网络的准备 2 3 更新args 计算c2 2 4 使用当前层的参数搭建当前层 2 5 打印并
  • Java在pdf文件中加入文字或图片

    pom 导入itextpdf 依赖
  • Python 印章代码(附有解析)

    1 题目 2 代码 共有n种图案的印章 每种图案的出现概率相同 小A买了m张印章 求小A集齐n种印章的概率 n m map int input split dp 0 for i in range n 1 for j in range m 1
  • 如何用计算机测试交易系统,一种自动售票机交易功能的测试系统和方法与流程...

    本发明涉及一种自动售票机检测领域 尤其是涉及一种自动售票机交易功能的测试系统和方法 背景技术 轨道交通的自动售票机 TVM 在接入线网投用之前 必须进行功能测试 以确保功能完备 交易完整 正常使用 目前的测试方法是通过人工购买车票的方法来测
  • Spring MVC如何进行数据校验呢?

    转自 Spring MVC如何进行数据校验呢 在web开发中 我们需要保证用户输入的合法性 那么SpringMVC中如何保证web 应用的合法性呢 下文将一一道来 如下所示 下文只讲述SpringMVC后端的验证方法 前端验证 由用户自身采
  • 独立按键(多个按键)控制LED移位

    这个代码设置的是两个按键对LED移位 分别是P3 1向右移 P3 0向左移 include
  • pycharm错Error updating package list: connect timed out误:解决(更换镜像源)

    问题 可能是网络问题 导致无法加载 报错 Error updating package list connect timed out 解决 File setting project interpreter 加号 manage reposit
  • vmware+CentOS5.0上安装oracle 10g数据库

    一 针对 Oracle 配置 Linux Linux 软件现已安装完毕 您需要针对 Oracle 对其进行配置 本部分将逐步讲解针对 Oracle 数据库 10g 配置 Linux 的过程 验证系统要求 要验证系统是否满足 Oracle 1
  • Docker简介以及安装使用(一)

    疫情下的上海 按下了暂停键 期待早日重回繁华 上海加油 文章目录 Docker简介 Docker的出现 Docker的优点 Docker的局限性 Docker架构 Docker的安装 Docker简介 Docker 是一个开源的应用容器引擎
  • 反馈判断方法

    负反馈放大器可组合成四种类型 即 电流串联 电流并联 电压串联 电压并联四种负反馈类型 正负反馈的判断 正负反馈的判断使用瞬时极性法 瞬时极性是一种假设的状态 它假设在放大电路的输入端引入一瞬时增加的信号 这个信号通过放大电路和反馈回路回到
  • 设计模式--Template模式 VS Strategy模式

    Template 模式和Strategy模式所要解决的问题类似 而且通常可以互换使用 Template模式使用继承来解决问题 Strategy模式使用委托来解决问题 如图1 template 模式 基类 BubbleSorter实现了通用算
  • 钉钉小程序头像剪切并压缩上传

    引入方式 json文件 usingComponents dd cropper components dd cropper dd cropper axml
  • 个人支付接口

    分享个人可以用的支付接口 用来实现收款实时回调 不用企业资质 不用签约 很方便 1 接口地址 请求地址 https www gogozhifu com shop api createOrder 2 注意事项 数据编码统一为utf 8 Req
  • 仿滴滴打车百度地图定位查找附近出租车或门店信息

    随着技术的发展 开发的复杂度也越来越高 传统开发方式将一个系统做成了整块应用 经常出现的情况就是一个小小的改动或者一个小功能的增加可能会引起整体逻辑的修改 造成牵一发而动全身 通过组件化开发 可以有效实现单独开发 单独维护 而且他们之间可以
  • 前置++与后置++区别 以及效率

    之前在杭州实习面试中科视拓时候面试官问道 前置 与后置 区别 以及效率 打破对C 的认识 后来 寒假回来看书后才恍然大悟 前置 和后置 的区别 C专家编程 中有如下描述 P276 人民邮电出版社 a表示取a的地址 增加它的内容 然后把值放在