C++自增运算符的理解

C++ 的算术、自增自减、位运算、关系与逻辑运算符(数据的操作) C++的数据基本操作,也包括底层数据的操作 阅读详情

前置自增和后置自增原理:

两种运算符的内部如下,参数int是为了区分前置和后置++,后面不跟变量。

同时建议平常尽量使用前置++,因为没有额外的性能损耗。

// 前置自增
T &operator++() {
    this = this + 1;
    return *this;
}

// 后置自增
T operator++(int) {
    T tmp = this;
    this = this + 1;
    return tmp;
}

*p++

由于++和*的优先级是一样的,而等级相同时结合方向时从右向左,故先计算++,再计算*;同时++操作符返回的是一个临时值,即返回的p再进行的++,等同于*(p++);

(*p)++

先计算*,再计算++;

*++p

运算符同级,从右向左,先计算++,再计算*;

++*p

运算符同级,从右向左,先计算*p,再计算++;

在上述理论上,对于不同的赋值情况可能会产生不同的效果,如下test2中的 (*p)++,编译器认为*p提取出来的是一个常量字符,故不能对齐做出修改操作,所以在这种情况下写法是有问题的。

#include <iostream>
#include <vector>
#include <cmath>
#include <algorithm>
#include <cstring>
#include <numeric>
#include <set>
#include <queue>

using namespace std;

void test1() {
  // *p++ 等同于 *(p++)
  int arr[] = {1, 4, 7, 9, 10};
  int *p = arr;
  int a = *p++;
  // 1 4
  cout << a << " "<< *p << endl;

  // (*p)++
  p = arr;
  int b = (*p)++;
  // 1 2
  cout << b << " " << *p << endl;

  // *++p
  p = arr;
  int c = *++p;
  // 4 4
  cout << c << " " << *p << endl;

  // ++*p
  p = arr;
  int d = ++*p;
  // 3 3
  cout << d << " " << *p << endl;
}

void test2() {
  char *c = "abcdef";
  char *p = c;
  char t;

  // *p++
  t = *p++;
  // a b
  cout << t << " " << *p << endl;

  // // (*p)++
  // p = c;
  // t = (*p)++;
  // // 可以看到,这里输出不了,因为编译器认为 t 对应的是常量字符
  // // 故不存在 ++ 操作
  // cout << t << " " << *p << endl;

  // *++p
  p = c;
  t = *(++p);
  // b b
  cout << t << " " << *p << endl;

  // ++(*p)
  p = c;
  t = ++(*p);
  // 同 (*p)++
  cout << t << " " << *p << endl;
}

int main(){
  test1();
  test2();
}

C语言中的a++与++a的速记理解 关于a++与++a理解时容易烦迷糊(未定义行为,undefiend behavior), 但在用时只要避免复杂难懂的表达式时,基本上都不会出错。如果需要全部理解二者区别,需要读2者的汇编语言。 下面谈一下自己的速记理解: 第一种 a++ ,名 后自增,因为加号在后面嘛,这个好理解,那往下一步思考,为什么叫后自增呢, 因为是先赋值,在自增运算。即下面b=a++,与下面等价: int a = 1 ; // b = a++ ; 与下面等价 b = a; //先赋值 a = a +... 阅读详情

相关推荐

c++的指针自增的使用,自增和*的混合运算

弄清楚运算符的优先级,对于一个程序员来说是极为重要的,虽然运算符的优先级是基础知识,但是很多时候我们会因小失大,所以学习一门语言一定要把基础东西弄懂,切不可得过且过! 下面我谈谈两个简单式子,并讨论他们的计算过程 由运算符的优先关系,++的优先级比*高 1.++*p++; 先计算p++,指针要往下移动一位,但注意这时候的++是后自增,所以得在这个表达式执行完p才是真正地向下移动了一位,此时

qq_33355333的博客 2275

条款六:自增(increment)、自减(decrement)操作符前缀形式与后缀形式的区别

条款六:自增(increment)、自减(decrement)操作符前缀形式与后缀形式的区别   很久以前(八十年代),没有办法区分++和--操作符的前缀与后缀调用。这个问题遭到程序员的报怨,于是C++语言得到了扩展,允许重载increment 和 decrement操作符的两种形式。  然而有一个句法上的问题,重载函数间的区别决定于它们的参数类型上的差异,但是不论是increment或decre

DX 1922

C++面试宝典第7题:重载自增自减运算符

在本题中,我们学习了如何重载前缀++、前缀--、后缀++、后缀--等运算符。前缀++和前缀--先进行加法减法运算,然后返回结果。后缀++和后缀--先返回变量的当前值,然后再进行加法减法运算。在使用这些操作符时,需要仔细考虑它们的行为,避免误用而导致的逻辑错误等问题。

hope_wisdom的技术博客 1158

C++:自增运算符(++)重载

自增运算符(++)分为前置自增和后置自增,它们两者主要的区别是:返回的值不同,以及执行自增操作的顺序不同。++前置自增运算符首先将操作数加1,然后返回自增后的值。这意味着如果你使用前置自增运算符对一个变量进行操作,你会在其他任何操作之前得到自增后的值。++后置自增运算符也会将操作数加1,但是它会返回自增前的值。这意味着如果你使用后置自增运算符对一个变量进行操作,你会在其他任何操作之后得到自增前的值。

WolvenSec的博客 2312

C++中的自增运算符:++i 和 i++

C++中的自增运算符:++i 和 i++在C++编程中,自增运算符是一种常用的操作符。其中 ++i 和 i++ 就是两种不同的自增运算符。

qq_37934722的博客 2942

C++中的自增自减操作

通过实际例子对C++中的自增自减操作符进行了细致的剖析

C++基础---自增自减运算符

1. 自增自减运算符 1.1 自增自减运算符的定义 自增运算符:++; 自减运算符:- -; 自增自减运算符:都是单目运算符, 只能应用于变量,而不能用于常量或表达式。结合性与简单赋值运算符相同,但优先级高于任何双目运算符。 1.2 自增自减运算符均有两种使用形式 前缀形式:即它们在操作数前,如:++x,- -x。 后缀形式:即它们在操作数后,如:x++,x- -。 前缀与后缀的表达式独立使用时:结果是没有区别

Catherine的笔记 3046

告别ORB-SLAM2?手把手教你用OpenVSLAM在Ubuntu 20.04上跑通第一个SLAM Demo(含依赖库避坑指南)

本文详细介绍了如何在Ubuntu 20.04系统上从ORB-SLAM2迁移到OpenVSLAM,包括环境配置、依赖库安装、编译调整及性能优化。OpenVSLAM凭借其模块化设计和多相机支持,在SLAM领域展现出显著优势,适合机器人导航和AR应用开发。文章还提供了实用的避坑指南和进阶技巧,帮助开发者高效完成迁移。

weixin_42524499的博客 253

c++入门学习(十七)自增和自减

【代码】c++入门学习(十七)自增和自减。

2301_78420308的博客 407

Geant4 案例分析(一): B1

本文是对Geant4 B1的案例分析,其中特定的功能不做介绍,而注重于各个文件的主要功能,以及它们组织的方式。

m0_51809467的博客 1578

GT-Power柴油机瞬态性能仿真与优化——基于EGR-VGT耦合控制策略【附案例】

本文探讨了GT-Power在柴油机瞬态性能仿真与优化中的应用,重点分析了EGR-VGT耦合控制策略的实际效果。通过案例研究展示了如何通过仿真优化提升柴油机的动力响应速度和排放性能,为车辆工程领域的工程师提供了实用的技术参考。

green的博客 760

C++ 自增运算符的重载以及理解

自增分为前增和后增。C++ 并不要求两者一定是类的成员函数,也可以是友元,但是更倾向于使用成员函数 先说一下两者的重载区别。 class Size{   private:     int size; } 一、前增 Size& Size::operator+(){ this->size++; return *this; } 二、后增 ...

weixin_30617737的博客 143

电机控制-PMSM无感FOC控制(四)SVPWM——过调制

上一章我们提到了SVPWM矢量合成的范围在一个平面的矢量圆内,那么当电压矢量超出调制范围时,该怎么做呢?这就是过调制要解决的问题。电机控制-PMSM无感foc控制(三)SVPWM据之前讲解的内容我们可以知道,SVPWM技术在电压空间上模拟了一个近似于圆的电压轨迹,减小了相电流的谐波,降低了电机的谐波损耗,抑制了转矩脉动。然而,SVPWM技术也存在一些问题,合成电压矢量有极限便是其中之一。这个半径为√3/3Vdc的区域也被称作SVPWM的线性区域。

zhuxinmingde的博客 1312

C++算术运算符陷阱:从整数除法与自增运算符理解底层原理与避坑指南

在编程语言中,运算符是构建表达式的基础,其行为直接决定了程序的正确性与性能。以C++为例,其算术运算符的设计遵循严格的类型系统和求值规则,理解其底层原理至关重要。整数除法运算时,若操作数均为整数,结果会向零截断,这是由操作数类型决定结果类型的基本规则决定的,直接影响财务计算等精度敏感场景。自增运算符则涉及前置与后置的本质区别:前置递增返回递增后的引用,通常性能更优;后置递增则返回递增前的值副本,可能产生临时对象。这些差异在复杂表达式或自定义类型(如迭代器)中尤为关键,不当使用会引发未定义行为或性能损耗。本文

weixin_32822843的博客 269

实战复盘:纷玩岛(Livelab)候补订单微信支付协议的逆向与复现

通过本次对纷玩岛候补支付接口的分析,我们实现了一个脱离 App UI 的轻量级支付发起器。这不仅验证了其API的设计逻辑(Standby -> PrePayInfo 分层设计),也为后续的自动化监控或辅助抢票工具提供了支付环节的技术验证。技术本无罪,关键在于如何使用。理解这些底层协议,有助于我们写出更健壮的代码,也能在遇到线上支付问题时快速定位是业务层(API)问题还是通道层(微信)问题。

猫敷雪 792

ROS2 机械臂末端刀具执行曲面路径规划入门教程

Noether工具路径规划系统摘要 Noether是一款用于网格曲面刀具路径规划的软件,支持喷涂、打磨、检测等机器人工艺流程。其核心流程分为三步:1)网格修改(平滑、分割等预处理);2)刀具路径规划(生成有序路径点序列);3)刀具路径修改(姿态调整等后期处理)。系统提供栅格规划和边界规划两种模式,支持自定义扩展。配套GUI工具可配置完整流程,包含网格处理、路径生成和可视化功能。通过示例演示了多组件网格处理、拼图边缘铣削等典型应用场景,并指导用户进行插件开发,实现圆柱体提取、摄像机悬停等定制化功能。系统采用模

机器人控制与仿真应用 914

深入理解C/C++中的自增运算符:i++与++i

当多个自增操作应用于同一个变量且顺序不明确时,程序的行为是未定义的。这意味着不同的编译器可能会产生不同的结果。示例int i = 1;// 结果可能因编译器而异int i = 1;// 结果可能因编译器而异使用i++时,表达式首先取i的当前值,然后i增加1。使用++i时,i首先增加1,然后表达式取i的新值。++i是左值,可以出现在赋值语句的左侧;i++在自增完成前不是左值。在编写程序时,应避免编写依赖于未定义行为的代码。贴一段栈和队列中用到的代码,体会!//写法一else。

bill.chengzhi的博客 2747

基于STM32设计的智能手环(ESP8266+华为云IOT)_178

为了满足用户对健康监测的需求,手环项目集成了血氧检测、心率检测、体温检测等功能。这些功能采用了专门的传感器模块,如MAX30102、DS18B20等,确保了测量数据的准确性和可靠性。同时,为了方便用户了解自己的运动情况,项目还加入了行走步数统计功能,通过MPU6050模块实现精确计步。

2400

C++前置自增运算符和后置自增运算符的重载

本文是关于重载单目运算符的实战讲解,用两个例子进行说明。理论不多,重在理解前置++和后置++的区别。在看本文之前,您需要了解运算符的重载的基本概念。如果不懂,也没关系,请进下面的传送门。 浅显易懂的C++运算符重载 理论: 前置单目运算符,重载函数没有形参。 后置单目运算符,重载函数需要一个int形参。只起到区别前置运算符的的作用。 人狠话不多,来,小二,上茶~~~ 例如下面的例子:  ...

专注技术 9221

063.CI/CD for ML:给YOLO项目装上自动化流水线

本文分享了为YOLO目标检测项目搭建CI/CD流水线的实践经验。作者通过手动调试模型导出问题的经历,意识到重复验证工作比模型改进更耗时,提出需要自动化解决方案。文章详细介绍了四阶段流水线设计:1)代码质量检查;2)快速训练验证;3)推理性能基准测试;4)模型注册部署。同时总结了环境不一致、GPU资源争抢等常见问题及解决方案,建议从简单规则开始逐步完善,强调模型版本管理的重要性。实施后不仅提高了效率,还促使团队形成更规范的开发习惯。

2603_95664987的博客 233

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

关于自增运算符++a和a++的问题

这个问题比较的麻烦,通常考虑这些问题的是需要参加计算机笔试考试的人,因为通常我们在项目中不会使用这种容易混淆的东西.解决这个问题我们首先需要知道下面的两句话a++ 先取a的值后运算a的值 ++a 先运算a的值后取a的值如果你记住了上面两个定理我们来看看这两段代码:int a = 0;Console.WriteLine(++a);上面这段代码的运行结果是1.int

flamelp(翔天)的专栏 1280

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

【c++教程】3.2-自增自减运算符

自增自减 前自增 ++c 前自减 --c 后自增 c++ 后自减 c-- 1,自增运算符相当于+=1,自减运算符相当于-=1,因此自增自减运算符是可以被替代的。 2,前自增/自减和后自增/自减的区别在于,前自增/自减是先增加/减少值,然后返回结果的引用。后自增/自减是先创建一个该对象的副本,然后再增加/减少值,最后返回副本。 3,由于前自增/自减返回的是引用,后自增/自减返回的是复制,因此,一般而言,前自增/自减的效率要更高。因此如果不是必须要使用后自增/自减,都应该使用前自增/自减。例如

程程之光 960

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

C++:重载前自增运算符和后自增运算符

class Step{ private: int num; public: Step(int num) {this->num = num;} int getStep() {return num;} Step& operator++(); //重载前自增运算符 Step operator++(int); //重载后自增运算符 }; Ste...

xikangsoon的博客 1233

C++自增 | C++自减运算符

自增运算符 在C++中,常常使用自增运算符(++),来使变量的值增1 i++ int i=3; int j; i++; j=i++; 在使用i之后,先让i的值加1,比如上述代码,执行j=i++之后,j的值是3,i的值才是4 ++i int i=3; int j; ++i; j=++i; 在使用i之前,先让i的值+1,上述输出j后,j的值为4 自减运算符 i-- int i=3; int j; i--; j=i--; 在使用i之后,先让i的值减1,如上述代码,执行之后,j的值是3,但是i的值变为2

weixin_48669767的博客 2173

C++中运算符的优先级

C++运算符优先级列表 优先级序号 运算符名 目 结合性 备注 1 :: 2 从左到右 作用域运算符 2 ++ , -- 1 后缀自增自减运算符 () , {} 2 函数风格转型 () 2 函数调用 [] 2 下标访问 . , -&gt; 2 成员访问 3...

zgq的博客 2万+

c++基础(五):运算符重载(左移和右移运算符、自增和自减运算符、指针运算符、赋值运算符、关系运算符)

这里写目录标题一级目录二级目录三级目录运算符重载1.1 运算符重载基本概念 一级目录 二级目录 三级目录 运算符重载 1.1 运算符重载基本概念 运算符重载,就是对已有的运算符重新进行定义,赋予其另一种功能,以适应不同的数据类型。 运算符重载(operator overloading)只是一种”语法上的方便”,也就是它只是另一种函数调用的方式。 在c++中,可以定义一个处理类的新运算符。这种定义很像一个普通的函数定义,只是函数的名字由关键字operator及其紧跟的运算符组成。差别仅此而已。它像任何其他函

m0_53077537的博客 2023
上一篇: 内存对齐规则(c++)
下一篇: C++父类指针指向子类原理
LearnToStick
博客等级 码龄9年 11粉丝 50原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值