Чем объясняется вывод следующей программы на C?
Я наткнулся на следующий код на 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
Может кто-нибудь объяснить, как это вывод для приведенного выше кода?
1 ответ
Решение
Приоритет операторов в C можно найти здесь.
В вашем примере единственное выражение, где приоритет имеет значение, это:
*ptr++
Здесь, постфиксный оператор ++
имеет более высокий приоритет, поэтому он эквивалентен
*(ptr++)
В остальном нет никакой двусмысленности ((*ptr)++
, *ptr
, *++ptr
а также ++*ptr
. Вы, кажется, смущены семантикой префикса и постфикса ++
операторы. Помните, что иногда вы увеличиваете указатель, а другие - то, на что он указывает. Вот что происходит:
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