C++中的++i 与 i++详解

2023-10-26

一、区别

i++ 与 ++i 的主要区别有两个:
1、 i++ 返回原来的值,++i 返回加1后的值。
2、 i++ 不能作为左值,而++i 可以。

二、原理

毫无疑问大家都知道第一点,我们重点说下第二点。
首先解释下什么是左值与右值

通俗地说,以赋值符号 = 为界,= 左边的就是左值,= 右边就是右值。 比如:(1) int b = 3;(2) int a = b;第(2)行代码,a为左值,b为右值。更深一点, 左值相当于地址值,右值相当于数据值左值是某个内存地址,右值是一个存储在某个内存地址里的数据。

下面的例子:

int i = 0;
int *p1 = &(++i); //正确,左值,可以取址
int *p2 = &(i++); //错误,右值,不可以取址

++i = 1; // 正确, 左值,可以被赋值
i++ = 5; // 错误,右值,不可以被赋值

那么为什么『i++ 不能作为左值,而++i 可以』?看它们各自的实现就一目了然了:

I++与++i的实现

// 前缀形式:++i
int& int::operator++() //这里返回的是一个引用形式,就是说函数返回值也可以作为一个左值使用
{//函数本身无参,意味着是在自身空间内增加1的
  *this += 1;  // 增加
  return *this;  // 取回值
}

//后缀形式: i++
const int int::operator++(int) //函数返回值是一个非左值型的,与前缀形式的差别所在。
{//函数带参,说明有另外的空间开辟
  int oldValue = *this;  // 取回值
  ++(*this);  // 增加
  return oldValue;  // 返回被取回的值
}

参考:

在程序开发中,++i 与 i++的区别在哪里? - 知乎

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

C++中的++i 与 i++详解 的相关文章

随机推荐

  • 【git】git rebase -i 合并多次提交

    1 概述 git rebase i 命令用于交互式地重新应用提交历史 其中 i 选项表示以交互方式进行操作 通过使用这个命令 您可以合并 删除 编辑 重排等操作提交历史 从而修改提交的顺序或合并多次提交 下面是使用 git rebase i
  • Linux简介

    1 1操作系统是什么 操作系统概述 要讲明白 Linux 是什么 首先得说说什么是操作系统 计算机系统是指按用户的要求 接收和存储信息 自动进行数据处理并输出结果信息的系统 它由硬件子系统 计算机系统赖以工作的实体 包括显示屏 键盘 鼠标
  • Xcode9 xcodebuild 命令行打包遇到的坑与解决方案

    主要涉及的打包脚本命令 if xcodeversion lt 830 then Xcode 8 3 以下打包时使用该脚本 xcodebuild exportArchive exportFormat ipa archivePath schem
  • 十一、文件的读写

    一 文件的读写模式 1 文件常用的打开模式 r 只能读 r 可读可写 不会创建不存在的文件 如果直接写文件 则从顶部开始写 覆盖之前此位置的内容 如果先读后写 则会在文件最后追加内容 w 可读可写如果文件存在则覆盖整个文件 不存在则创建 w
  • 数学建模 —— 降维算法

    文章目录 前言 数据降维的作用 一 主成分分析 PCA 1 介绍 2 算法流程 3 主成分分析的说明 二 因子分析 FA 1 介绍 2 算法流程 3 因子分析和主成分分析的对比 三 典型相关性分析 CCA 1 介绍 2 算法思路 3 算法流
  • 用位运算实现两个整数的加减乘除运算

    位运算的思想可以应用到很多地方 这里简单的总结一下用位运算来实现整数的四则运算 1 整数加法 int Add int a int b for int i 1 i i lt lt 1 if b i for int j i j j lt lt
  • 网络七层及四层协议通俗详解

    1 OSI开放式网络七层协议模型 总体而言 理解记忆 我点击一个网络请求 假如使用http协议 这就是应用层 用户选择具体的协议 这个请求需要传输数据 但是不同系统因为编码等方式不同 无法识别彼此发送的消息 这个时候表示层就需要把数据整理成
  • 《剑指offer》读后感

    帮研二的学姐准备网易暑期实习的机试时 代码提交在一个OJ网站叫牛客网 出于好奇就多点了一下这个网站 看到 剑指offer 的在线编程专栏 就是把剑指offer中的题目都挂在了网上 可以在线判断是否AC 以前也总是听到学长们推荐该书 索性趁着
  • R语言实现样本量的估算(2)

    本文默认 0 05 sig level 0 2 power 根据研究需要可调整 导入包 library pwr 1 已知标准差和预期差异 1 单样本t检验 某治疗措施预期提高某物质水平8mg L 标准差为10mg L 单样本t检验 pwr
  • QVector用法详细介绍

    QVector类是动态数组的模板类 顺序容器 它将自己的每一个对象存储在连续的内存中 可以使用索引号来快速访问它们 使用前需要包含头文件 include
  • iOS(二)App第一次启动时出现的引导界面

    我们每次打开一个刚刚从AppStore下载下来的软件时 总会出来一个引导界面 有的是宣传产品 有的是介绍App的功能 最后再出来一个按钮正式进入到App 从此以后这个引导界面就再也不会出现了 除非你卸载重装 在查阅相关资料后 做了个简陋的引
  • 逆向爬虫06 bs4,xpath,pyquery实战

    逆向爬虫06 bs4 xpath pyquery实战 原本想要详细的对比一下这三个模块的使用方法 但是在实战的时候发现 只要遵循一个套路 抓取静态网页 即网页信息直接放在html源代码中 就比较容易了 一些使用细节上的问题 每个人遇到的都会
  • Unity Hub、unity、PlasticSCM安装

    目录 一 Unity Hub安装 二 Unity安装 三 PlasticSCM安装 一 Unity Hub安装 第一步 进入官网下载 地址 地址 第二步 安装 跟着提示走就行 二 Unity安装 第一步打开Unity Hub 激活许可证 点
  • 打印机服务器纸张属性不显示,为什么我的打印机能在打印机服务器属性里设置自定义纸张大小,却无法? 爱问知识人...

    问题原因及解决方法 在以往的Windows 98操作系统中 打印机属性里的 纸张大小 中有 自定义 一项 而Windows 2000和Windows XP中自定义的位置是不同于Windows 98的 这里用一个示例来表述 假定用户使用了一款
  • VMware中安装CentOS7

    在VMware中安装CentOS7 01 目录 CentOS7的下载 CentOS7的配置 CentOS7的安装 CentOS7的网络配置 自动获取IP 固定获取IP 02 安装前提 准备工作 提前下载和安装好VMware 下载centos
  • 环境扫描/透射电子显微镜气体样品架的真空压力和微小流量控制解决方案

    摘要 针对环境扫描 透射电子显微镜对样品杆中的真空压力气氛环境和流体流量精密控制控制要求 本文提出了更简单高效和准确的国产化解决方案 解决方案的关键是采用动态平衡法控制真空压力 真空压力控制范围为1E 03Pa 0 7MPa 采用压差法控制
  • Using Java to create customized virtual machine clones on VMWare infrastructure

    Hello Quite a while ago I was given a task to create a java module which would be able to create customized clones from
  • python制作词云图

    准备基础模块 matplotlib 数据可视化模块 numpy 数值计算模块 jieba 分词模块 wordcloud 词云模块 Pillow PIL 图像处理模块 同时准备遮罩图和文本信息 实现代码 导入matplotlib模块pyplo
  • 数据挖掘学习之路二:数据预处理方法概述

    主要是将数据中缺失的数据补充完整 消除噪声数据 识别和删除离群点并解决不一致性 主要达到的目标是 将数据格式标准化 异常数据清除 错误纠正 重复数据清除 A 异常数据处理 分析异常数据 1 使用统计值进行判断 最大值 最小值 平均值等判断是
  • C++中的++i 与 i++详解

    一 区别 i 与 i 的主要区别有两个 1 i 返回原来的值 i 返回加1后的值 2 i 不能作为左值 而 i 可以 二 原理 毫无疑问大家都知道第一点 我们重点说下第二点 首先解释下什么是左值与右值 通俗地说 以赋值符号 为界 左边的就是