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

mac2024-03-30  34

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

首先,关于++运算符的特性,我们需要了解一下。 ++在前,则变量先自身加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; }

最新回复(0)