天天看点

C语言的指针和自加符号的优先级

*和++的优先级

c是一种自由度非常高的语言,在编程过程需要考虑各种优先级的划分,本文分享一下有关指针和自增(自减)符号的优先级划分。首先我们先确定一点,指针和自增符号的优先级是一样的,且运算顺序都是自右向左的,所以按照同优先级谁先出现谁老大的规则,从右向左哪个符号先出现那个就是优先的。

多说无益我们来编译器里面试试看:

int a = 50;
	int* b = &a;
	printf("a = %d,b = %d\n", a, b);
	printf("the no:%d\n", *b++);
	printf("the no:%d\n", *b++);
           

输入上面一段十分简单的变量初始化与打印的程序,这边定义了一个变量a以及一个指针变量b指向a,我们先打印a和b的值,再打印*b++这个表达式,运行结果如下所示:

C语言的指针和自加符号的优先级

上面的结果,第一行显示了a、b的值,第二行显示了a的值,也就是显示了指针b的值,第三行就出现了一个不可预见的值,我们知道后缀++会在该行语句结束之后才执行,而且这边我们没有加括号,++和 指针的优先级相同,所以上述现象的原因就是先显示了指向a的指针b的值也就是50,再把b这个值++,b的实际值存储的是a的地址,所以++后是变量a的后一个地址,我们不可预知,所以就出现了上述现象。

我们接着运行下面这段代码:

int a[3] = { 50 ,55 ,60 };
	int* b = a;
	printf("a = %d,b = %d\n", a[0], b);
	printf("the no:%d\n",*b++);
	printf("the no:%d\n",*b++);
	printf("the no:%d\n",*b);
           

上述代码运行后结果如下所示:

C语言的指针和自加符号的优先级

首先第一行一样显示了a[0]、b的值,第二行printf首先打印了b的值,然后把b++,所以b指向a[0]的后一个也就是a[1],所以第三行printf打印了b的值也就是a[1]的值55并再次把b++,之后b指向a[2],打印值就十分明显的表示出来了。

最后我们再加上++符号在前缀的情况

int a[5] = { 50 ,55 ,60 ,65 ,75 };
	int* b = a;
	printf("a = %d,b = %d\n", a[0], b);
	printf("the no:%d\n", *b++);
	printf("the no:%d\n", *++b);
	printf("the no:%d\n", ++*b);
	printf("the no:%d\n", *b);
           

运行结果如下所示:

C语言的指针和自加符号的优先级

从上述结果来看,第一行printf打印了两个值;第二行printf打印了指针b的值并让b++,此时b指向a[1],第三行printf中先将b的值++后再取指针运算,所以b先指向了a[2]后打印出来的值也就是60了,第四行的printf,先取指针运算再++,由于优先级相等,所以此时是先取值,然后把那个值加1,所以取出a[2]的值也就是60再+1后得到61,最后我们打印*b的值,也是61。

总结

正如开头所说的,俩优先级一样,谁先再后面出现谁先来(因为这俩都是从右向左运算的),但同时要考虑++是前缀还是后缀。以上写法只是方便我们更好的读懂程序,这边笔者建议不是很熟练的还是加上括号吧,作为优先级界顶端的存在,加上()能够有效提高我们程序的可读性。

继续阅读