二级C语言教材上的一个练习题,关于结构体的,麻烦各位

来源:百度知道 编辑:UC知道 时间:2024/06/18 16:41:59
有定义和语句

struct st

{int n;

struct st *next;

};

struct st a[3],*p;

a[0].n=5 ; a[0].next=&a[1];

a[1].n=7; a[1].next=&a[2];

a[2].n=9; a[2].next='\0';

p=&a[0];

以下表达式的值为6的是:

A.p++->n B.p->n++ C.++(*p).n D.++p->n

题目给出的参考答案是D
但是我认为C D没什么差别,都对的样子
每项解释下那就更好,谢谢!!
感谢你们的回答
. 和 ->是c语言中运算符优先级别最高的

A 是5,也就是a[0].n

B 也是5,因为是后缀

C写法是错误的,注意p是指针

D是6,前缀加嘛,先是p->n=5,然后++为6

个人感觉 选项C这是个语法错误吧 = =
6.n 这是不会通过编译的吧
==========================================================
(*p).n不是对a[0]这个结构体中n的引用 这本身就是个语法错误
如果非要用* 那也应该是*(p.n)

C中加在了n上
D中才是先对指针操作.
建议复习下操作符的优先级表

*p本身是a[0],p->n==5,++p->n==6;
A,如果是p++,则p++的优先级最低,所以最后才运算,p++->n,是5,然后p向后移指向a[1];
B,同上,也是5,然后a[0].n自加,但是那是后话,这里没意义;
C,本身就错误了,指针++是指向下一个地址,a[0]是一个数据结构,(*p)表示的也就是a[0],这个数据结构自加则会让它的数据以二进制的储存方式自加1,这样没意义

问题补充:
感谢你们的回答
但有一点是,.(*p).n和p->n不都是对a[0]这个结构体中n的引用吗
确实,(*p).n和p->n都是对a[0]中的n的引用,但区别就在于++X,只会对++后面紧跟的一个东西自加,++p->n中++后面的第一个东西是p->n,p->n不是两个数据,所以就得到5以后再自加;而++(*p).n中++后面的第一个东西是(*p),也就是对(*p)操作了在去找其中的.n,所以不对了,我是这样理解的