【全网最细】——C语言自增(自减)运算符详解 [不会你打我]
(++a + ++a) 等于多少?
一、自增(自)运算符介绍(以自增为例)
自增自减运算符顾名思义,不需要别的参数,就可以自己 +1 或 -1 。它们在C语言中大量使用,且使用非常灵活(还是重要考点),因此,需要重点理解。
++ : 自加运算符,连续两个 " + " 组成,可放在变量前( ++a )或放在变量后( a++ )进行运算
前置自增运算符,在运算时,先对变量取值,再进行 +1 操作。如下所示,经过 a++ 后,先将取到的 a 的值打印,再自加 1 。
// 后置自增运算符(a++)
int a = 1;
printf("%d", a++ );
printf("%d", a);
前置自增运算符与后置相反,在运算时,先进行 +1 操作,再对变量取值。如下所示,经过 ++a 后,先自加 1 ,再打印的 a 的值 2 。
// 前置自增运算符(++a)
int a = 1;
printf("%d", ++a );
printf("%d", a);
以上就是最最最基本的,单个自增(自减)运算符的计算介绍。
二、两个自加(自)变量的计算
一个自加(自减)运算符只需要注意 " ++ " 在前还是在后即可,那么,两个或者多个呢?本章节,将详细介绍两个自增(自减)运算的过程。
1. 当 a = 1时,( a++ 加 a++ )的值是多少
按照计算关系顺序而来,从左到右计算,从左边的 a++ 开始,先取 a 的值为 1 ,再a = a +1 ,此时第一个 a++ 的值为 1 ,但a的值已经从 1 变为 2 ,
再进行右边的 a++ 时,由于 a = 2 ,取到的 a 的值为 2 ,随后再进行自加操作;
因此,当 a = 1 时,( a++ 加 a++ )的值是 1 + 2 = 3。
// a++ 加 a++
int a = 1;
printf("%dn", a++ + a++ ); // a = 1 + 2 =3
printf("%d", a); // a = 3
2. 当 a = 1时,( a++ 加 ++a )的值是多少
同理,左边的 a++ 先取值为1,再进行自加,此时 a++ 的值为1,但 a 的值已经变为2;
当进行右边的 ++a 操作时,先进行自加1,再取值,此时a = a + 1 = 2 + 1 =3。
因此,当a = 1时,( a++ 加 ++a )结果是 1 + 3 = 4
// a++ 加 ++a
int a = 1;
printf("%dn", a++ + ++a ); // a = 1 + 3 = 4
printf("%d", a); // a = 3
3. 当 a = 1时,( ++a 加 a++ )的值是多少
对于上式,从左往右顺序计算,首先计算 ++a ,即先自加1( a = a +1 = 1 + 1 = 2 ),再取值,然后再对右边进行计算;
此时, a = 2, a++ 是先取值再+1,所以取值 2 。
因此, 当a = 1时,( ++a 加 a++ )的值是 2 + 2 = 4
// ++a 加 a++
int a = 1;
printf("%dn", ++a + a++ ); // a = 2 + 2 = 4
printf("%d", a); // a = 3
什么!为什么不是 4 ?让我们接下去看看。
4. 当 a = 1时,( ++a 加 ++a )的值是多少
对于上式,从左往右顺序计算,首先计算 ++a ,即先自加1( a = a +1 = 1 + 1 = 2 ),再取值,然后再对右边进行计算;
此时, a = 2, ++a 是先 +1 再取值,所以取值 3 。
因此, 当a = 1时,( ++a 加 ++a )的值是 2 + 3 = 5。
// ++a 加 a++
int a = 1;
printf("%dn", ++a + ++a );
printf("%d", a);
什么?!也不是 5 吗?这是个什么道理呢?
三、两个自加(减)运算符 计算原理纠正
经过上面的实验,我们发现:
- a++ 的计算规律是符合规定的,即先取值,再 +1 ;
- ++a 的计算不符合规定,不是先 +1 ,再取值。
原来, ++1 在取值的时候,是最后一步做的,即存在 ++a 时,要对 a 的操作都结束,再取值。
借用2.3的例子:当 a = 1 时,( ++a 加 a++ )的值是多少。
// ++a 加 a++
int a = 1;
printf("%dn", ++a + a++ ); // a = 2 + 2 = 4
首先进行 ++a 计算,a = a + 1 = 2,但是这时候并不取值(最后再取),而是接下去进行 a++ 的操作,即先取 a = 2 ,再 +1,此时 a = 3 。
注意,此时运算式子已经结束,需要进行最后一步,即 ++a 的取值,此时返回 3 。
所以打印的 ++a + a++ 的值为 5 。
同理,2.4也可得证。
// ++a 加 a++
int a = 1;
printf("%dn", ++a + a++ );
首先进行左边 ++a 的操作,即,自加 1 ,此时 a 的值变为 2 ,但是不对 a 取值,而是再进行右边的 ++a 的操作,即,a = a +1 = 3 。此时,运算式结束,返回两个 ++a 的值都为 3 ,所以最后打印出来的结果为 6 。
到此,我自己以为已经掌握了 ++ 的全部秘密,发现,三个 ++ 一起出现时,结果好像又不是这样了。
四、多个自加(自减)变量的计算
由于 a++ 的计算方法不变,所以只介绍有 ++a 参与的计算
1. 当 a = 1时,( ++a 加 a++ 加 a++ )的值是多少
对于上式,首先计算 ++a ,即 a = a + 1 = 2 ;再计算中间的 a++ ,取 a = 2 ,再 +1 ,此时 a = 3 ;随后计算右边 a++ ,取 a = 3 , 再 +1 ,此时 a = 4 ;最后,将 a = 4 赋值给 ++a 。
此时,原式的值 = 4 + 2 + 3 = 9 。
// ++a 加 a++
int a = 1;
printf("%dn", ++a + a++ + a++ );
如果我有罪请惩罚我,而不是让我在这里搞这个。
五、多个自加(减)运算符 计算原理纠正
原来,多个运算符在一起计算的时候,要注意中间的运算符喔!!!
尤其是,被忽略的 " + "号,是双目运算符,需要计算完成再进入下一个计算
因此,对 4.1 的式子,可化为:( ++a + a++ ) + a++ 。
- 计算左半边,先是 ++a ,即 a = a + 1 = 2 ;再计算括号内的 a++ ,取 a = 2 ,再 +1 ,此时 a = 3 ,最后将 a = 3 赋值给 ++a;
- 随后计算右边 a++ ,取 a = 3 , 再 +1 。
此时,原式的值 = 3 + 2 + 3 = 8 。
再附赠一个 ++a + ++a + ++a 的计算。
先将其转化为 ( ++a + ++a ) + ++a 。
- 计算左半边,先是 ++a ,即 a = a + 1 = 2 ;再计算第二个 ++a ,让 a = a +1 = 3 ,最后将 a = 3 赋值给 ++a (两个);
- 随后计算右边 ++a ,先 +1 ,再将 a = 4 赋值给 ++a 。
此时,原式的值 = 3 + 3 + 4 = 10 。
// ++a 加 a++
int a = 1;
printf("%dn", ++a + ++a + ++a );
至此 , 基本上摸清楚了 。
六、我多说一嘴
- 底层原理调用还没看,不知道有没有影响
- 本文图片均来自 : 菜鸟工具