自增和自减操作符(++ --) 与 逗号表达式

本文详细介绍了C语言中的自增运算符的前置和后置用法,包括它们的计算方式和注意事项。同时,文章讲解了逗号表达式的运算顺序和整个表达式的值,强调了运算优先级和嵌套应用的理解。通过实例代码分析了不同情况下的结果,提醒程序员避免重复计算和理解表达式的正确含义。
摘要由CSDN通过智能技术生成

(一)自增&自减运算符

前置++

++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;
}

思考这段代码的含义——

  1. 对 a = 5; c = ++a; 得c=6 ; a=6
  2. 逗号表达式——b = ++c, c++, ++a, a++; 从左至右计算,则最终 a=8 ;b=7 ; c=8 ;
  3. 对 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这个作用广泛,逗号表达式在我局限的视野中也是较少见的。但是也要掌握好了,我们才是一个优秀的编程人!这些知识总会派上用场的!加油,朋友们,我们顶峰见!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值