C/C++ 自加自减运算

C++ 运算符进阶

一开始,我本来打算直接在深度练习中讲解答案的过程中对其中的自加自减进行讲解,但是后面发现,其实篇幅比较长,内容也比较多,因此就单独拎出来讲解。这是一个我自认为非常难的点。下面我们开始进入正题。


1. 问题的提出

当我们这样使用自加运算时,能很轻易地运算出我们想要的结构,如下:

int a = 1;
a++;

亦或者这样:

int a = 1;
++a;

因为不管怎样,这样的运算都是将变量a加一,只不过一个是先自加再运算,另一个是先运算,再自加。而上面的结果无疑都是2.

那么如果我们这样呢?

int a = 1;
a = a++ + ++a;

此时的a为多少呢?


2. 问题分析

此时我们就需要对所谓的运算要有进一步的了解了,怎样算一步运算呢?我们举个例子:

1+2+3 我们可以分为两步,首先是 1+2,得到结果 3 ,再进行 3+3得到最后结果6,也就是可以这样写 ((1+2)+3),如果你了解计算器的原理,那么你对这绝对不会陌生。

知道这个之后我们应该如何能得出上面代码的结果呢?

我们知道 a++ 是先运算,再自加,而 ++a则相反,是先自加,再运算。而再运算中自加也算是一步运算。所以我们形象解释的运行步骤如下:

a = a++ + ++a;

1. a++自身就是一次运算,但是再自身运算前,我们是将a++这个位置置为之前的数,也就是1. 也就是 a = 1 + ++a;
2. 当进行到这一步时已经完成一步运算,所以 a自加,此时 a = 2;
3. 之后对++a进行运算,因为++a是先自加,再运算,所以此时a = 3,然后再进行运算,也就变成 a = 1+3=4

当我们打开C++程序并编写相应的代码之后你会发现结果的确如我们所分析的。


3. 问题的进一步探讨

相应的,自减也是如此,那么关于这个问题是否就到这里就结束了呢?当然没有,下面我们将上面的代码稍微的改变一下:

int a = 1;
a = ++a + a++;

我们这样的话结果应该是多少呢?

如果按照之前的分析,++a是先进行加的操作,那么此时a = 2,也就是 a = 2 + a++;然而a++是先运算再加,所以a = 2+2;此时自加a = 3,最后执行a=2+2的赋值操作,a被修改为4.那么事实是这样吗?当我们在程序中运行该代码时,发现返回值a=5,并非我们想象的那样,那到底是哪里错误了呢?

4. 揭晓真相

通俗易懂的讲,你可以把++a这个操作看成是从一个地址取值,当需要拿出来运算是才将值取出来运算,而a++是将当时a的值直接固定,不管后面结果如何改变。

拿上面的例子来说。

int a = 1;
a = ++a + a++;

1. ++a运算,a = 2,但是在++a这个位置,其实类似是一个a引用,它先将a自加,然后还是此处依旧放着变量a。
2. 之后执行后面的 a++操作,这个操作之前描述了是将此时a的值固定在该位置,不会受后面值改变的影响。所以此时等式变成了 a = a + 2;此时再执行 a++ 运算,a = 3;
3. 最后执行 a = a + 2 ,由于现在 a = 3,所以该等式等价于 a = 3+2=5;

为了方便理解,可以参考下图:
自加自减运算详解

使用上述的方法,再去做

int a = 1;
a = a++ + ++a;

你会发现,很简单,很快就能解决,步骤如下:

1.固定a,等式为:a=1+ ++a; 同时a++,此时a=2
2.执行++a,此时a = 3,等式为: a=1+a;
3.取出a进行运算:a = 1+3=4
4.输出,a=4

那如果我们加大难度:

int a = 1;
a = ++a + ++a + a++ - --a;

这个结果是多少呢?

首先我们要了解等式是一步一步执行的,所以我们一步一步来就可以了。下面我们就来分析:

1. 执行++a,a = 2,等式变为:a =a+ ++a +a++ - --a;
2. 执行++a,a = 3,等式变为:a =a+a+a++ - --a;
3. 前面加法运行,等式变为:a = 3+3+a++ - --a=6+a++ - --a;
4. 执行a++操作,等式变为:a =6+3- --a,a自加,a=4;
5. 前面加法执行,等式变为:a=9- --a;
6. 执行--a,则a=3,等式变为:a=9-a;
7. 执行最后的减法:a=9-3=6,结束。

当我们将代码放入程序运行发现,的确如此。

5 结束语

这个问题是在我的一次做题过程中延申而来,当时的题目是最简单的那种,就是一开始我们就能分析得来。后面由于好奇心的驱使,便自己加大难度,不断增加运算,发现自己完全不会。便一路在网上找答案,但是基本没有想要的,因为只涉及最开始的自加自减。

后面由于种种原因,没能及时解决,找到答案,在再次学习C++决心自己写个笔记,以作学习教程时才再次去思考。

在写这篇文章时,我尽量没有涉及深的概念,这些都是使用浅显易懂的语言来表达,当然我个人能力有限,难免出现纰漏,如有错误之处。请大家批评指正。

如有需要学习数据结构,可以前往GitHub其中一个项目,目前正在对数据结构进行更新,网址如下:

数据结构详解

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值