Почему *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 на самом деле называется. Именно тогда, когда побочный эффект ++ применяется не указано, кроме того, что это происходит до следующей точки последовательности. В этом случае точка последовательности возникает после того, как все аргументы функции были оценены и до вызова функции.

Другие вопросы по тегам