++*P--;
这是一道考试题,如果 P
是指向数组中任何元素的指针,请解释这条语句的真正作用。
我什至写了一个简单的代码来评估它:
int i;
int* array = calloc(10, sizeof(int));
for (i = 0; i < 10; i++) {
array[i] = i;
printf("%d,", array[i]);
}
int* P = array + 5;
printf("\n %p", P);
printf("\n %d", *P);
++*P--;
printf("\n %p", P);
printf("\n %d \n", *P);
for (i = 0; i < 10; i++) {
printf("%d,", array[i]);
}
但输出更让我困惑:
0,1,2,3,4,5,6,7,8,9,
0x100105534
5
0x100105530
4
0,1,2,3,4,6,6,7,8,9,
看起来它首先取消引用 P
,然后增加它的值,然后减少指针 P
的值,但为什么呢?
根据p53的K&R表2-1(见下图)
++、-- 和 *(取消引用)从右到左具有相同的优先级和结合性。
所以第一步应该是减少值P
,然后是取消引用,然后是增加取消引用值,我错了吗?
最佳答案
你是正确的,优先级是
++(*(P--))
但请注意,递减是一个后缀操作:即使对 P
的更改首先发生,表达式的其余部分仍使用 P
的旧值。因此,在您的示例中,首先 P
递减为 array+4
,但是 P--
的值是 array+5
,所以 array[5]
递增。
关于c - 该语句的优先级是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31442100/