首先,ptr指针指向的是结构体数组a中的第二个元素,也就是定义的第二个结构体2,&a[2]
还是优先级的问题,D选项先是->
找到了i1元素2,然后进行前置++,2就变成了3。
struct s
{
int i1;
struct s* i2;
};
static struct s a[3] = { 1,&a[1],2,&a[2],3,&a[0] }, * ptr;
int main()
{
ptr = &a[1];
//int a = ptr->i1++;//2,先找到了2赋值给a后,i1才++
//int a = ptr++->i1;//2,找到了2赋值给a后,指针++指向了下一个
//int a = *ptr->i1;//错误,无法对int类型解引用
int a = ++ptr->i1;//3
printf("%d\n", a);
return 0;
}
(A) 表达式值为2,ptr指向数组中第2个元素,ptr->i1是2,后缀++返回的是2,i1变成3
(B) 表达式值为2,ptr++后缀++返回指针值仍然指向第二个元素,所以值是2,之后ptr指向第三个元素
(C) 语句非法,i1为整型,不能解引用
(D) 表达式值为3:ptr->i1值是2,前缀++,i1值变为3
(A) 表达式值为2,ptr指向数组中第2个元素,ptr->i1是2,后缀++返回的是2,i1变成3
(B) 表达式值为2,ptr++后缀++返回指针值仍然指向第二个元素,所以值是2,之后ptr指向第三个元素
(C) 语句非法,i1为整型,不能解引用
(D) 表达式值为3:ptr->i1值是2,前缀++,i1值变为3