#include <stdio.h>
int main() {
char u[] = "UVWXYZ";
char v[] = "xyz";
struct T {
int x;
char c;
char *t;
} a[] = {{11, 'A', u}, {100, 'B', v}}, *p = a;
p = a;
printf("*(++p)->t = %c\n", *(++p)->t);
p = a;
printf("*++p->t = %c\n", *++p->t);
p = a;
printf("++*p->t = %c\n", ++*p->t);
}
字符串
结果是:
*(++p)->t = x
*++p->t = V
++*p->t = W
型
好吧,我认为*(++p)
和*++p
是相同的,因为指针会先递增。但是为什么*(++p)->t
和*++p->t
有不同的结果?另外,我认为++*p
意味着指针指向u[0]
,也就是'U'
,那么'U'
会递增。所以我认为结果应该是'V'
?
2条答案
按热度按时间kyks70gy1#
*(++p)->t
被计算为*((++p)->t)
,因为间接操作符*
的precedence比->
小。您递增p
,因此现在指向a[1]
并返回正确的*t
,即v[0]
。然后在下一行中重置
p = a
。*++p->t
被计算为*(++(p->t))
,因为前缀运算符++
的优先级低于->
,而前缀运算符++
和间接运算符*
的优先级相同,它们是从右到左关联的。效果是设置a[0].u = &u[1]
,然后打印值u[1]
。++*p->t
被计算为++(*(p->t))
,效果是增加存储在u[1]
的值,所以它现在是下一个字母'W'
。字符串测试数据的选择不是很好,因为你不能从
%c
中分辨出你是推进了指针还是增加了值*(u+1) == (*u) + 1
。cyvaqqii2#
我明白了...我犯了个错误!
1.第一个月
++p
:所以p指向{100,'B',v}->t
:指向字符串v*
:得到v[0],即x*++p->t
个p->t
:指向字符串u++p->t
:指向u[0]*
:获取u[0] = 'V'的值++*p->t
个p->t
:指向字符串u*p->t
:获取u[0] = 'U'的值++*p->t
:'U'递增,因此u = "VVWXYZ"
但是为什么第三个表达式在我的代码中输出“W”?
答案在第二个表达式中,
++p->t
makea[0].t = "VWXYZ"
!