操作符——区别C++前置++和后置++

news2024/11/25 7:13:42

0

这里写目录标题

  • 1.问题引出
    • Q:重载++或者--的时候如何区分前置和后置?
  • 2.C+规范
  • 3.前后置++实现
  • 4.为什么++++i;可以 i++++;不行

1.问题引出

Q:重载++或者–的时候如何区分前置和后置?

以前C+对前置和后置++没有很好的办法可以区分,为了解决这个问题,C++决定扩充,允许++和–操作符的两种形式(前置和后置)拥有重载能力

2.C+规范

这时候出现了一个语法上的问题:重载函数是以其参数类型来区分彼此的,然而不论increment 或decrement 操作符的前置式或后置式,都没有参数。为了填*这个语言学上的漏洞,只好让后置式有一个int 自变量,并且在它被调用时,编译器默默地为该int 指定一个0值:

class UPInt l

// "unlimited precision int.

public:

UPInt& operator++();

//前置式(prefix)++。

const UPInt operator++(int);

UPInt& operator--();

const UPInt operator--(int);

// 后置式(postfix)++。//前置式(prefix)--。// 后置式(postfix)--.

UPInt& operator+=(int);

//+=操作符,结合UPInts和ints.

UPInt i;

++i;i++;--i;i--;

// 调用 i.operator++();// 调用 i.operator++(0);// 调用 i.operator--();// 调用i.operator--(0);

这样的规则或许有点怪异,但你很快就会习惯。重要的是,那些操作符的前置式和后置式返回不同的类型,前置式返回一个reference,后置式返回一个const对象。以下我集中讨论++操作符的前置式和后置式,至于–操作符,故事一样。

3.前后置++实现

从 C的时代回忆起,你或许还记得所谓 increment 操作符的前置式意义“increment and fetch”(累加然后取出),后置式意义“fetch and increment”(取出然后累加)。这两个词组值得记下来,因为它们几乎成为前置式和后置式 incremen操作符应该如何实现的正式规范:

  • 前置式代码实现
//前置式:累加然后取出(increment and fetch)。

UPInt& UPInt::operator++()

*this += 1;

return *this;

//累加(increment)。

// 取出(fetch)。
  • 后置式代码实现
//后置式:取出然后累加(fetch and increment)。

const UPInt UPInt::operator++(int)

UPInt oldValue = *this;

++(*this);

// 取出(fetch)。

return oldValue;

//累加(increment)。

//返回先前被取出的值。
  • 请注意后置式操作符并未动用其参数。是的,其参数的唯一目的只是为了区别前置式和后置式而已。

为什么后置式 increment 操作符必须返回一个对象(代表旧值),原因很清楚。但为什么是个const对象呢?想象一下,如果不这样,以下动作是合法的:
UPInt i;

i++++;

//实施“后置式increment 操作符”两次。

这和以下动作相同:

i.operator++(0).operator++(0);

这就拨云见日了:operator++的第二个调用动作施行于第一个调用动作的返回对象身上

4.为什么++++i;可以 i++++;不行

在C++中,++i和i++都是递增运算符,用于将变量增加1。它们之间的主要区别是它们的返回值和副作用的发生时间。

  1. ++i是前置递增运算符,它首先将变量递增1,然后返回递增后的值。
int i = 1;
int result = ++i;
// 现在,i 的值是 2,result 的值也是 2

  1. i++是后置递增运算符,它首先返回变量的当前值,然后将变量递增1。
int i = 1;
int result = i++;
// 现在,i 的值是 2,result 的值是 1

现在来看一下为什么 ++++i 是有效的,而 i++++ 不是有效的。

  • ++++i 中的前两个 ++ 是递增运算符,应用于 i。这将使 i 的值增加2,并返回增加后的值。然后,剩下的 ++ 运算符再次递增了这个结果。所以 ++++i 是有效的。
  • i++++ 中的第一个 ++ 是递增运算符,应用于 i。这将使 i 的值增加1,并返回递增前的值。然后,剩下的 ++ 运算符在一个临时副本上执行递增操作,而不是在 i 上。因此,i++++ 是无效的,因为第二个 ++ 运算符没有操作数。
  • 总结起来,++i 和 i++ 的区别在于返回值和递增操作的发生时间。对于 ++++i 这样的表达式,前两个 ++ 运算符作用于同一个变量,而对于 i++++,第二个 ++ 运算符没有操作数,因此不是有效的表达式。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/740739.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

面试之SpringAOP的理解:

AOP(面向切面编程)指的是那些业务本身无关,但是被业务模块所共同调用的业务逻辑或责任(日志管理,权限管理等)封装起来,便于减少系统的重复代码,降低系统见的耦合性,有利于未来系统的扩展性。 S…

IOS开发工程师的发展前景怎么样

本文目录一览 1,iOS开发工程师就业前景怎么样2,北大青鸟java培训IOS开发前景怎么样3,iOS开发工程师就业前景怎么样4,作为一个iOS开发程序员我的未来何去何从5,IOS开发工程师的发展前景怎么样6,ios开发工程…

Ubuntu 20.04 L2TP VPN 自动重连脚本,cron定时任务设置

1、连接VNP脚本 reconnect_l2tp_vpn.sh #!/bin/sh ppp0_flagifconfig | grep ppp0 echo $ppp0_flag if [ -z "$ppp0_flag" ];thenecho "connet to vpn ..."# connet vpn# echo PASSWORD | sudo -S 这样可以不用手动输入密码!echo abc123| su…

我爱学QT-QT信号和槽

1.给控件改名字 为了分析代码方便,我们要给控件改名字。要通俗易懂。 2.信号和槽 信号:信号就是指控件发出的特定的信号。 比如按钮的信号 槽:槽就是槽函数的意思,我们可以把槽函数绑定在某一个控件的信号上。 3.怎么关联信号…

IntelliJ IDEA中生成jar包并运行

1. 过程 依次选择菜单:File->Project Structure…,打开“Project Structure”界面。 在打开界面的左侧列表中选择:Artifacts,点击右侧出现的号。 在出现的菜单中依次选择:JAR->From modules with dependencies…

家政行业丨制作便捷高效的家政小程序

随着现代生活节奏的加快和家庭需求的多样化,越来越多的人开始寻找一种更方便、更高效的方式来获取家政服务。而家政小程序的兴起为这一需求提供了理想的解决方案。本文将简要介绍家政小程序是什么,探讨家政小程序的好处,并提供一些制作搭建家…

element上传文件对格式限制的处理

需求&#xff1a;上传的文件格式必须是pdf格式&#xff0c;方便查看 规定多种格式用逗号隔开 使用这个属性可以规定上传文件格式&#xff0c;但是有bug 可以手动改变显示的文件类型&#xff0c;还是可以传其他文件类型 所以需要在上传的时候限制上传的文件格式 上传组件 <…

X2000 Linux 调试VL53L4CD

由于VL53L4CD具有更高的精度&#xff0c;更低的功耗&#xff0c;所以尝试将VL53L4CD移植到X2000上进行测试。 一、下载驱动 en.VL53L4CD_LinuxDriver 二、SDK中加入驱动 1、加入源码 在\module_driver\devices下创建VL53L4CD文件夹&#xff0c;再将\en.VL53L4CD_LinuxDriver…

网络爬虫-jd滑块验证码

仅供研究学习使用。 目标站点 --> 京东网页登录 当我们输入账号密码后&#xff0c;点击登录&#xff0c;首先映入眼帘的是一个滑块&#xff0c;那我们先分析一下滑块吧。 上图是滑块的有关信息&#xff0c;左边的横线是请求的url&#xff0c;右边是参数&#xff0c;很显然&…

敏捷测试自动化

目录 前言&#xff1a; 敏捷宣言 敏捷软件开发VS传统方法 敏捷云服务 对什么进行自动化&#xff1f; 测试自动化的技巧 关于敏捷测试和自动化测试的关键信息 前言&#xff1a; 敏捷测试自动化是在敏捷开发环境中使用自动化工具和技术来支持测试活动的一种方法。它旨在提…

SQL使用(一):如何使用SQL语句去查询第二高的值

今天刷MYSQL题的时候刷到这样一个题&#xff1a; 编写一个 SQL 查询&#xff0c;获取 Employee 表中第二高的薪水&#xff08;Salary&#xff09; 。------------| Id | Salary |------------| 1 | 100 || 2 | 200 || 3 | 300 |------------例如上述 Employee 表&a…

时间序列预测 | Matlab自回归差分移动平均模型ARIMA时间序列预测,可实现多步预测,对未来的数据实现预测

文章目录 效果一览文章概述部分源码参考资料效果一览 文章概述 时间序列预测 | Matlab自回归差分移动平均模型ARIMA时间序列预测,可实现多步预测,对未来的数据实现预测 评价指标包括:MAE、RMSE和R2等,代码质量极高,方便学习和替换数据。要求2018版本及以上。 部分源码 %% …

C语言比较容易出错的printf语句/cout语句

请问以下代码的输出结果是什么&#xff1f; int main() {int n 2;//cout << n << n << n--;printf("%d %d %d", n, n, n--);system("pause");return 0; } 结果&#xff1a; 很奇怪&#xff1f; 为什么会这样&#xff1f; 原来自己之…

MOVEit再现新漏洞,多个版本受影响

今年6月&#xff0c;文件共享工具MOVEit Transfer曾曝出SQL 注入漏洞&#xff0c;能让远程攻击者访问其数据库并执行任意代码。最近&#xff0c;MOVEit Transfer 母公司Progress Software又披露了三个新漏洞。 这三个漏洞分别是 CVE-2023-36932、CVE-2023-36933 和 CVE-2023-36…

【ACL 2023】具有高效推理速度的中文领域文图生成扩散模型和工具链

近日&#xff0c;阿里云机器学习平台PAI与华南理工大学合作&#xff08;阿里云与华南理工大学联合培养项目&#xff09;在自然语言处理顶级会议ACL2023上发表了具有高效推理速度的中文领域文图生成扩散模型和工具链Rapid Diffusion。它是面向中文特定领域的文图生成模型&#x…

了解MQL4,轻松自定义外汇交易收益曲线

外汇交易是现代社会中增长最快的交易形式之一&#xff0c;而MQL4编程语言是一种针对外汇交易的编程语言。熟练使用MQL4编程语言可以帮助交易者轻松自定义外汇交易收益曲线。本文将介绍什么是MQL4&#xff0c;以及如何使用MQL4来自定义外汇交易收益曲线。 一、什么是MQL4 MQL4…

MyBatis 中的 SQL 映射文件如何配置参数映射,如何使用

MyBatis 中的 SQL 映射文件如何配置参数映射&#xff0c;如何使用 MyBatis 是一种开源的 Java 持久化框架&#xff0c;它可以自动将数据库中的数据映射到 Java 对象中&#xff0c;并且使得 Java 对象可以非常方便地存储到数据库中。在 MyBatis 中&#xff0c;SQL 映射文件是一…

Tomcat之安装与项目部署

Tomcat是一个免费、开源的javaWeb轻量级应用服务器 优于是使用Java开发的&#xff0c;需要运行在java虚拟机中&#xff0c;所以必须安装jdk&#xff0c;以提供运行环境。 Tomcat可以看做一个http服务器&#xff0c;通过组件Connector接收http请求并解析&#xff0c;然后把结果…

Xmake v2.8.1 发布,大量细节特性改进

Xmake 是一个基于 Lua 的轻量级跨平台构建工具。 它非常的轻量&#xff0c;没有任何依赖&#xff0c;因为它内置了 Lua 运行时。 它使用 xmake.lua 维护项目构建&#xff0c;相比 makefile/CMakeLists.txt&#xff0c;配置语法更加简洁直观&#xff0c;对新手非常友好&#x…

hbuilderX 的使用

1 创建nui-app 点击左上角的文件点击新建-》项目&#xff0c;将信息填写完整点击确定 2 uni-modules 插件管理 通过 uni-app 插件市场 实现 uni-modules的插件安装&#xff0c;在插件市场搜索对应的插件名称&#xff0c;点击进去&#xff0c;点使用Hbuild’erX导入插件。详细…