数据结构第二次的作业的内容还是指针和结构体为主,有很多小细节想和大家分享。
致命的运算符位置与优先级
毫不夸张地说,作业的选择题基本上全是错的这个问题。++运算符的前与后虽然很小,但是在某些时候是致命的错误。来看几个例子:(大家可以不看答案先自己选)
若有以下定义,则数值不为3的表达式是
int x[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, *p1;
(A) x[3]
(B) p1 = x + 3, *p1++
(C) p1 = x + 2, *(p1++)
(D) p1 = x + 2, *++p1
第一个题目的关键是就是这个++运算符在哪的问题,易错的可能会是B选项,以为p1++之后就变成了4,所以不对。其实挖的坑就在这里,错误原因其实是我们对++运算符前后位置关系的影响不清楚。
对于p++,虽然进行了++操作,但是当你再使用*来对其中的内容进行调用的时候,p其实没有变,也就是说怕p的值在你进行调用的时候还没变,只是有一个++的操作在里面,等到下一次,在不同的语句中你调用他的时候才会前移。大家可以想一想我们烂熟于心的for(int i=0;i<n;i++)语句,你有没有想过明明都进行++操作了,可是你在后面的循环中使用i的时候,i还是当前的位置,没有向前进?这就是++在变量后面的本质,当在同一个语句/一个循环中使用++并调用该变量时,使用时其值是没有改变的。
这样的话问题就好解释了,C选项最终的值其实还是2,而D选项,由于++是在前面,因此调用的时候,p的值就会按照向前移一位的值来进行调用,因此是对的。
总结一下,++在前面,调用时其值不会变化;++在后面,调用时,其值就会按照+1之后的值来进行使用。
下面再来看一下有关运算符优先级的一个问题。
若有以下说明和语句:
struct student{
int age;
int num;
}std, *p;
p = &std;
则以下对结构变量 std 中成员 age 的引用方式不正确的是
(A) std.age
(B) p->age
(C) (*p).age
(D) *p.age
主要问题还是在D选项上,其实说实话我也对优先级的问题一直不知道,下面这篇文章很详细地给出了优先级表以及结合顺序(也很重要)。
原文链接:C语言运算符优先级(超详细)
针对上面的问题,D选项中我们可以知道,"."这个运算符是优先级最高的,而*这个运算符是在第二级的,因此如果不加括号,就会先是p与age结合,这很明显是错的。
在结构体和指针相关的问题里面,可以记下面几个顺序:"."和"->"以及() 大于 "*"(作为取值符),''&"(作为取址符)”++和--“ 大于 加减乘除。
当处于同一级的运算符在一起的时候,需要考虑他们结合的方向。比如*和++是处于一级的,而且结合顺序是从右向左,因此*p++(p是一个指针),代表的是先把指针进行++操作,再进行取值,而不是先对p指针进行取值,然后再把这个值进行+1的操作。
谢谢大家阅读,希望我遇到的问题也能给你一点帮助哦~~~