*和++的优先级
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++这个表达式,运行结果如下所示:
上面的结果,第一行显示了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);
上述代码运行后结果如下所示:
首先第一行一样显示了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);
运行结果如下所示:
从上述结果来看,第一行printf打印了两个值;第二行printf打印了指针b的值并让b++,此时b指向a[1],第三行printf中先将b的值++后再取指针运算,所以b先指向了a[2]后打印出来的值也就是60了,第四行的printf,先取指针运算再++,由于优先级相等,所以此时是先取值,然后把那个值加1,所以取出a[2]的值也就是60再+1后得到61,最后我们打印*b的值,也是61。
总结
正如开头所说的,俩优先级一样,谁先再后面出现谁先来(因为这俩都是从右向左运算的),但同时要考虑++是前缀还是后缀。以上写法只是方便我们更好的读懂程序,这边笔者建议不是很熟练的还是加上括号吧,作为优先级界顶端的存在,加上()能够有效提高我们程序的可读性。