自增自减与赋值运算

首先我们来看一下赋值运算符的使用,请看下面的代码和输出结果。

1 #include<stdio.h>
2 
3 int main(void)
4 {
5     int a=2,b=7;
6     b+=++a;
7     printf("a=%d,b=%d",a,b);
8     return 0;
9 }

输出结果如下:

a=3,b=10

如果仅仅是一个等于号进行赋值,那么把右边表达式的值提取出来存放到等号左边对应的存储空间(一般就是存给一个变量)。

如果是类似于+=这种形式,例如a+=3,就相当于是a=a+3。

然后我们来看一下自增运算符(因为自减运算符同理,所以本文不再阐述)。

如果是a++这种形式,那么就是先把a变量的值传出来使用然后再自增,也就是a++这个表达式的值是原先a的值,且a++只能成为一个表达式了,不能当变量来用,即不能对a++进行赋值,不能a++=2。

如果是++a这种形式,那么就是先将a变量自增,再传出自增后的值,也就是++a这个表达式的值是自增后a的值,且++a不仅可以是表达式,也可以当变量来用,相当于是变量a,可以对++a进行赋值,即++a=5,是有效的。(本人之前理解错误,应该是只能对a赋值,不能对++a、a+=1、a=2等赋值,但是这些都能代表变量a的值)

所以说下面请看几个例子,分别是含有b=a++,a=a++,a+=++a,a+=a++的代码(在一个C语言程序里同时含有以上内容)。

 1 #include<stdio.h>
 2 
 3 int main(void)
 4 {
 5     int a=2,b=a++;
 6     printf("(1)a=%d,b=%d\n",a,b);
 7     a=a++;
 8     b+=++b;
 9     printf("(2)a=%d,b=%d\n",a,b);
10     a+=a+++(a+=++a);
11     b+=(b+=++b)+(++b);
12     printf("(3)a=%d,b=%d\n",a,b);
13     return 0;
14 }

运行结果如下:

(1)a=3,b=2
(2)a=4,b=6
(3)a=31,b=45

Note:本人不建议初学者研究第三行的输出结果。

为了方便读者理解,本人写出了等效代码如下(输出结果是一样的):

 1 #include<stdio.h>
 2 
 3 int main(void)
 4 {
 5     int a=2,b=a;
 6     a++;
 7     printf("(1)a=%d,b=%d\n",a,b);
 8     a=a,a++;
 9     b=b+1,b+=b;
10     printf("(2)a=%d,b=%d\n",a,b);
11     a+=++a;
12     a+=(a++)+(a);//a+=a+a,a++;
13     b+=++b;
14     b+=(b)+(++b);//++b,b+=b+b;
15     printf("(3)a=%d,b=%d\n",a,b);
16     return 0;
17 }

注释相当于是对等效代码的这一行代码再次化简。

原文地址:https://www.cnblogs.com/leisureeen/p/12100391.html