++p->i
p++->i
*p->i
*p->i++
(*p->i)++
*p++->i
我不明白上面的这些语句,我写了一个小测试程序来理解它们。
#include <stdio.h>
struct my_structure {
int i;
};
void main() {
struct my_structure variable = {20};
struct my_structure *p = &variable;
printf("NAME: %d\n", ++p->i);
printf("NUMBER: %d\n", p++->i);
printf("RANK: %d", *p->i++);
printf("name: %d\n", *p->i++);
printf("number: %d\n", (*p->i)++);
printf("rank: %d", *p++->i);
}
这是我注释完最后四个 print
语句后得到的输出:
NAME: 21
NUMBER: 21
取消注释代码并编译后我得到:
test.c: In function 'main':
test.c:14:24: error: invalid type argument of unary '*' (have 'int')
printf("RANK: %d", *p->i++);
^~~~~~~
test.c:15:26: error: invalid type argument of unary '*' (have 'int')
printf("name: %d\n", *p->i++);
^~~~~~~
test.c:16:29: error: invalid type argument of unary '*' (have 'int')
printf("number: %d\n", (*p->i)++);
^~~~~
test.c:17:24: error: invalid type argument of unary '*' (have 'int')
printf("rank: %d", *p++->i);
最佳答案
首先,一些提醒:
p++
计算出 p
的当前值,并且作为副作用将 1 添加到 p
。如果 p
是一个指针,它被设置为指向序列中的下一个对象。
++p
的计算结果为 p + 1
的当前值,并且作为副作用将 1 添加到 p
。同样,如果 p
是一个指针,它被设置为指向序列中的下一个对象。
++
的后缀形式和->
运算符有相同的优先级,并且比+的一元(前缀)形式有更高的优先级+
和 *
。因此,像++p->i
这样的表达式被解析为++(p->i)
,p->i++
被解析如(p->i)++
,*p->i
被解析为*(p->i)
等。
有了这个……
表达式
++p->i
被解析为
++(p->i)
并计算 p->i
的当前值加 1,并且作为 副作用 更新 p->i
。
表达式
p++->i
被解析为
(p++)->i
并评估当前的 p->i
,然后更新 p
以指向序列中的下一个 struct
对象。
表达式
*p->i
被解析为
*(p->i)
因为 ->
的优先级高于一元 *
。一元 *
的操作数必须是指针类型,但是 p->i
是一个整数,所以编译器会在这个表达式上 yak。
表达式
*p->i++
被解析为
*((p->i)++)
同样,编译器会对这个表达式大吼大叫,因为 *
的操作数不是指针类型。
表达式
(*p->i)++
被解析为
(*(p->i))++
同样,p->i
没有指针类型,所以编译器会发脾气。
表达式
*p++->i
被解析为
*((p++)->i)
再一次,更多的 yakkage。
关于c - p 是一个指向结构的指针,所有这些代码片段都做了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53747225/