以下 C 程序输出的解释是什么?
What is the explanation for the output of the following C program?
我在 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
有人可以解释一下上面代码的输出结果吗?
C中运算符的优先级可以查到here.
在您的示例中,优先级重要的唯一表达式是:
*ptr++
这里后缀运算符++
的优先级更高,所以等价于
*(ptr++)
其余的((*ptr)++
、*ptr
、*++ptr
和++*ptr
。)你似乎对pre的语义感到困惑- 和后缀 ++
运算符。请记住,有时您会增加指针,而其他人则增加它指向的东西。这是发生了什么:
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
我在 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
有人可以解释一下上面代码的输出结果吗?
C中运算符的优先级可以查到here.
在您的示例中,优先级重要的唯一表达式是:
*ptr++
这里后缀运算符++
的优先级更高,所以等价于
*(ptr++)
其余的((*ptr)++
、*ptr
、*++ptr
和++*ptr
。)你似乎对pre的语义感到困惑- 和后缀 ++
运算符。请记住,有时您会增加指针,而其他人则增加它指向的东西。这是发生了什么:
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