【C语言】运算符*和++的优先级关系及两者结合使用分析

运算符*和++都属于单目运算符,两者的优先级是一样的,结合性的方向是从右到左。

首先,关于++运算符的特性,我们需要了解一下。
++在前,则变量先自身加1,然后参与所在表达式的其它运算;
++在后,则变量首先参与所在表达式的运算,然后在当前语句最后结束前(以分号作为结束标志)自身加1。
见下例:

/代码1
int p=5;
int i;
i=p++;//此处,i的值为5,p的值还是5
printf("i=%d,p=%d\n",i,p);//此处,i的值为5,p的值已经变为6
/代码2
int p=5;
int i;
i=++p;//此处,p的值首先加1变为6,然后赋值给i
printf("i=%d,p=%d\n",i,p);//此处,i的值为6,p的值为6

然后我们分析一下几种情况:

1、*p++

*(p++)这种写法尽量不要这样写,容易引起歧义,编译器实际上还是按照*p++来处理。

因为文章开头提过,运算符*和++都属于单目运算符,两者的优先级是一样的,结合性的方向是从右到左。
然后有些人会认为这个表达式的运算顺序是:p先自身+1,然后进行解引用。其实这种想法是错误的。
正确的运算顺序应该是首先解引用指针变量p,然后p在自身加1。
之所以不按照从右向左的结合性,是因为++自身的特性引起的,我们在前面已经讲过。

例1:

#include <stdio.h>

int main(void)
{
	int a[3]={1,2,3};
	int *p=a;
	int t;
	
	printf("*p=%d\n",*p);//指向数组a的a[0]元素
	
	t=*p++;
	printf("t=%d\n",t);//t的值等于a[0]的值
	
	printf("*p=%d\n",*p);//指向数组a的a[1]元素
	
	return 0; 
}

在这里插入图片描述

2、*++p

*++p的运算顺序就是首先p自身加1,然后对p进行解引用。

例2

#include <stdio.h>

int main(void)
{
	int a[3]={1,2,3};
	int *p=a;
	int t;
	
	printf("*p=%d\n",*p);
	
	t=*++p;
	printf("t=%d\n",t);
	
	printf("*p=%d\n",*p);
	
	return 0; 
}

在这里插入图片描述

  • 45
    点赞
  • 134
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值