我在geeksquiz.com上遇到了以下代码,但无法理解如何在C中评估涉及前缀,后缀和解除引用运算符的表达式:
#include <stdio.h>
#include <malloc.h>
int main(void)
{
int i;
int *ptr = (int *) malloc(5 * sizeof(int));
for (i=0; i<5; i++)
*(ptr + i) = i;
printf("%d ", *ptr++);
printf("%d ", (*ptr)++);
printf("%d ", *ptr);
printf("%d ", *++ptr);
printf("%d ", ++*ptr);
free(ptr);
return 0;
}
输出为:
0 1 2 2 3
有人可以解释一下这是上述代码的输出吗?
答案 0 :(得分:1)
可以找到C中运算符的优先级here。
在您的示例中,优先级唯一重要的表达式是:
*ptr++
这里,后缀运算符++
具有更高的优先级,因此它等同于
*(ptr++)
其余部分((*ptr)++
,*ptr
,*++ptr
和++*ptr
不存在歧义。)您似乎对此前的语义感到困惑postfix ++
运算符。请记住,有时你会增加指针,其他指的是它指向的东西。这就是:
printf("%d ", *ptr++); // Increment pointer, de-reference old value: 0
printf("%d ", (*ptr)++); // De-reference pointer, increment, yield old value
// Evaluates to 1, sets *ptr to 2
printf("%d ", *ptr); // De-reference ptr, yields 2 (see above)
printf("%d ", *++ptr); // Increment ptr, de-reference: 2
printf("%d ", ++*ptr); // De-reference (2), increment result: 3