Почему *s и *s++ имеют одинаковое значение в следующей ситуации?
char *s;
char buf [] = "This is a test";
s = strchr (buf, 't');
if (s != NULL)
printf ("found a 't' at %s\n", s);
printf("%c\n",*s);
printf("%c\n",*s++);
printf("%c\n",*s++);
printf("%c\n",*s++);
printf("%c\n",*s++);
Этот код выводит:
found a 't' at test
t
t
e
s
t
Program ended with exit code: 0
На мой взгляд, *s должно быть t
и *s++ должен быть e
, Но почему они имеют одинаковое значение в этом коде?
2 ответа
Решение
В выражении *s++
, ++
является постинкрементным оператором. Это означает, что по порядку происходит следующее:
- Значение
s
получается - затем
s
увеличивается - Тогда старое значение
s
разыменовывается
Так,
printf("%c\n",*s); // Prints the character at s
printf("%c\n",*s++); // Prints the character at s
// ***and then*** increments it
Они оба будут печатать один и тот же символ.
Если вы хотите, чтобы ваш пример кода работал так, как вы думаете, просто удалите первый printf
без постинкремента на s
:
// s points to the 't'
printf("%c\n",*s++); // Prints 't'. Afterward, s points to the 'e'
printf("%c\n",*s++); // Prints 'e'. Afterward, s points to the 's'
printf("%c\n",*s++); // Prints 's'. Afterward, s points to the 't'
printf("%c\n",*s++); // Prints 't'. Afterward, s points to the NUL terminator
printf("%c\n",*s++);
(более или менее 1) эквивалентно
printf("%c\n",*s);
s++;
Вот почему вы видите 't'
напечатано дважды.
Выражение i++
оценивает к текущей стоимости i
и как побочный эффект увеличивает переменную.
1. Более или менее, потому что
s
будет обновлено после *s
оценивается, но до printf
на самом деле называется. Именно тогда, когда побочный эффект ++
применяется не указано, кроме того, что это происходит до следующей точки последовательности. В этом случае точка последовательности возникает после того, как все аргументы функции были оценены и до вызова функции.