目录
(一)自增&自减运算符
前置++
++a
解释
++在a的前面即前置
计算方式
先+1,后使用
int a = 10;
int b = ++a;
printf("a=%d b=%d\n",a , b);
这段代码输出为 a=11 b=11
(a+1后再与b相加)
后置++
a++
解释
++在a的后面即后置
计算方式
先使用,后+1
int a = 10;
int b = ++a;
printf("a=%d b=%d\n",a , b);
这段代码输出为 a=11 b=10
(a先与b相加,再自增1为11)
注意
int a=10;
a++;
printf("%d\n",a);
int a=10;
++a;
printf("%d\n",a);
这两段代码输出结果都是11,因为没有“使用”过程
前置- -和后置- -同理
应用举例
#include <stdio.h>
int main()
{
int a, b, c;
a = 5;
c = ++a; //先+1后使用
b = ++c, c++, ++a, a++;
b += a++ + c;
printf("a = %d b = %d c = %d\n", a, b, c);
return 0;
}
思考这段代码的含义——
- 对 a = 5; c = ++a; 得c=6 ; a=6
- 对逗号表达式——b = ++c, c++, ++a, a++; 从左至右计算,则最终 a=8 ;b=7 ; c=8 ;
- 对 b += a++ + c; 即 b=b+(a++)+c; 得 b=7+8+8=23; 而最终a=9;b=23; c=8;
最终输出为——
敲重点:
注意,本例中需要注意前置、后置自增符号的区别及应用,逗号表达式的理解,以及运算符优先级的问题。
(二)逗号表达式
就本例来说, b = ++c, c++, ++a, a++;
运算顺序为从左到右,整个表达式的值为最后一个表达式的值,即a++,注意,此处a++中的a指的是从左到右计算后叠加的值,不是对表达式b = ++c, c++, ++a, a++;之前的a的值的自增。
运算优先级
赋值运算符 = 的表达式优先级高于逗号表达式
但在运算表达式中(指与±*/%等相比)最低
理解:从左至右的运算顺序
a=5;
b=a*3,a++,a++;
b的值为15,不受后面两个a++的影响
什么是整个表达式的值
int m;
m=(b = ++c, c++, ++a, a++);
此处m即为表达式的返回值,也就是最右边的a++
而上面的例子中我们需要的是b的值,在逗号表达式 b = ++c, c++, ++a, a++;中b只进行了一次赋值,也就是 b = ++c;所以b=7.
嵌套应用
(b=a*10,2),a=3
对于这个简单的嵌套,我们很容易看出(b=a*10,2)的值为2,而整体的值为3 (a=3的返回值就是3)。
变式练习
- 变式1——
#include <stdio.h>
int main()
{
int a, b, c;
a = 5;
c = ++a; //先+1后使用
b = (++c, c++, ++a, ++a);//注意这里变动了两处:最右边a++变成++a;并给等号右边的整体加了括号
printf("b = %d\n",b);
return 0;
}
进行了两处改动(代码注释里已说明)
来看看结果吧——
这是因为(++c, c++, ++a, ++a)是一个逗号表达式,其返回值为++a,请将(++c, c++, ++a, ++a) 与 (b=++c, c++, ++a, ++a)进行区别,虽然返回值都是a++,但显然不能混为一谈。
如果去掉括号:
#include <stdio.h>
int main()
{
int a, b, c;
a = 5;
c = ++a; //先+1后使用
b = ++c, c++, ++a, ++a;//没加括号版
printf("b = %d\n",b);
return 0;
}
结果为——
- 变式2
#include <stdio.h>
int main()
{
int a, b, c;
a = 5;
c = ++a; //先+1后使用
int m=(b = ++c, c++, ++a, a++); //增加了m作为返回值
printf("m=%d\n",m);
printf("a = %d b = %d c = %d\n", a, b, c);
return 0;
}
阁下认为m的输出结果是什么呢?是8吗?
那我们来看看输出结果吧——
为什么是7呢?相信你仔细想想就会恍然大悟,这个表达式的返回值是表达式a++呀!,而a++是后置自增,即“先使用后+1”,即将a自增前的数值赋给m,然后a再自增!
- 变式3——
#include <stdio.h>
int main()
{
int a, b, c;
a = 5;
c = ++a; //先+1后使用
b = ++c, c++, ++a, a++;
printf("返回值为%d\n",b = ++c, c++, ++a, a++);
printf("a = %d b = %d c = %d\n", a, b, c);
return 0;
}
这次我们将逗号表达式b = ++c, c++, ++a, a++;直接放在printf()函数里,之后再输出a,b,c的值,各位想想这个跟上面的输出一样吗?
我们试试看——
为什么返回值不是7了?而且a,b,c的值也发生了变化!
——其实答案很简单,printf(“返回值为%d\n”,b = ++c, c++, ++a, a++);这行输出函数中将表达式b = ++c, c++, ++a, a++又计算了一次,因此返回值和a,b,c的值都改变了。
所以我们在写代码的时候一定不要重复不必要的表达式!(由真实事件改编)
(三)小结
自增和自减有关前置和后置的区别应用场景其实没有单纯的令a+1这个作用广泛,逗号表达式在我局限的视野中也是较少见的。但是也要掌握好了,我们才是一个优秀的编程人!这些知识总会派上用场的!加油,朋友们,我们顶峰见!