【发布时间】:2015-07-15 22:12:50
【问题描述】:
++*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的值,然后取消引用,然后增加取消引用的值,我错了吗?
【问题讨论】:
-
优先级和评估彼此无关。优先级决定了源代码序列的含义(它是解析规则的一部分)。评估是关于确定表达式的值。在计算它的价值之前,您需要先了解它的含义。
标签: c operator-precedence associativity