详细 C语言自增自减运算符区分 ++n和n++

详细解读各种情况的C语言自增自减运算符区分 以 ++n和n++示例


前言

C语言谭浩强版本当中对于运算符的讲解,不是特别的清楚,尤其是解释自增自减运算符n++和++n的各种使用场景的时候,由于自增自减运算符,老是容易让人掉坑,所有我总结了一下关于自增自减运算符出现在以下情况中的使用,如果还有其他情况的出现我会及时更新:


一、基础变量类型的自增自减

自增自减运算符,当我们去查看书或者在网上搜寻区别的时候,最多的回答就是:
n++是先赋值,n再加1
++n是n先加1,再去赋值

这样的解释把,其实是很正确的,但是,对于新手小白却不友好,因为说出这样话的人,已经能够深刻的理解到,他们能够区分出来两者到底不同于什么地方,以至于传授经验的时候,不容易被小白同学们消化,下面我会多举例子来验证一下两者的区别:

示例1:单独使用

int main()
{
	int a=0,b=0;
	a++;
	++b;
	cout<<"a的值为:"a<<"b的值为:"<<b<<endl;
}

运行结果:
a=1;b=1;

这种情况下的的a++和b++,当程序执行到a++的时候,执行的操作就是对a的值进行+1;也就是a=1;
同样的情况下++b也是如此,当执行到++b的时候,同样程序进行的操作直接对b进行+1,也就是b=1;
那么这样看过来,好像a++和b++的结果也没啥区别?,是的,结果确实是没啥区别,最后a和b的值都为1;

示例2:用在赋值表达式当中

int main(){
	int a=0,b=0,num_1,num_2;
	num_1=a++;
	num_2=++b;
	printf("%d,%d,%d,%d",num_1,num_2,a,b);
}

运行结果:
num_1=0;num_2=1;a=1;b=1;

那么这一次,a++和++b不像示例1作为一个单独的运算出现,而是参与到了赋值运算当中,将值需要赋值给num_1和num_2;
这个时候我们可以看出来a++和++b之间的区别了,对它进行详细分析:
当程序执行num_1=a++的时候:
实际上按照运算符的优先级的基础上,程序会对于num_1=a++,这一段代码,进行分两步进行:
1.由于a++的特性是先赋值再运算,刚开始时候a=0,所以会把num_1通过变量a的值,赋值为0;
2.然后在对a进行+1运算,这个时候a+1,a从0->1;
当程序执行num_2=++b的时候:
实际上按照运算符的优先级的基础上,程序会对于num_2=++b,这一段代码,进行分两步进行:
1.由于++b的特性是先运算再赋值,,刚开始的时候程序读到这一段,会首选对num_2=++b的变量b进行+1,也就是b=1;
2.然后b的值现在为1,再对num_2进行赋值操作,这个时候num_2就获取到了1这个值,程序结束.

示例3:用在条件循环表达式当中

int main(){
	int a=1;
	while(a++<5);
	printf("%d",a);//输出a的值
	int b=1while(++b<5);
	printf("%d",b);//输出b的值
	
}

运行结果:
a=6;b=5

这里自增运算符不仅可以用到赋值表达式当中,也可以用到条件表达式当中;
我们应该有这举一反三的思想,既然在赋值表达式里面a++应该是先赋值在+1,那么在条件循环表达式当中,应该是先执行循环条件然后再+1,下面请看分析:
例子:while(a++<5);其中a++<5称为循环条件;
程序执行过程依分为两步走:

  1.  a=1,1<5 while表达式为T ;
    
  2.  a+1;即a=2;
    

然后去执行while循环体中的内容;我们这里没有内容,所以就会再一次进行判断:

  1.  此时a=2,2<5;while表达式为T;
    
  2.  		a+1;即a=3;  ...
    

然后去执行while循环体中的内容;我们这里没有内容,所以就会再一次进行判断:
当执行到:

  1.  a=5,5<5;while表达式为F,
    
  2.  a+1	;a=6;
    

这个时候由于while为F,程序结束,所以a=6;
同理,++b<5的情况完全是上面的情况反着来,程序会对b先+1,然后在执行判断条件b<5;最后结束循环的时候,b=5;

二.指针类型的自增自减的使用

关于指针类型的自增自减,其实和基本变量类型的处理方式差不多:
无论a++是在哪一个表达式当中,记住要先****,在a+1;
++a则是先a+1,在进行****;

示例1:用在*运算符中

int main(){
	char *s="abcdef";
	char *p=s;
	printf("%c",*p++);
	printf("%c",*++p);
}

运行结果;
a
c
这里p指向的是字符串中字符a的首地址;
printf("%c",p++);
1.先printf("%c",p);由于p指向的是字符a,所以打印出来了a
2.p+1,此时p会指向b;
printf("%c",
++p);
1.先p+1,此时p从指向b变为指向字符c;
2…先printf("%c",p);由于p指向的是字符c,所以打印出来了c

总结

后续想到更多的种类题目会继续更新,欢迎提出问题和给出意见,加油~

  • 22
    点赞
  • 66
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵙嵙程序猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值