为什么 *s 和 *s++ 在以下情况下具有相同的值?

why *s and *s++ have the same value in the following situation?

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。但为什么它们在此代码中具有相同的值?

表达式*s++中,++post自增运算符。这意味着按顺序发生以下情况:

  • 得到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 上的 post 增量:

                        // 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 之前更新。没有指定 ++ 的副作用何时应用,除了它发生在下一个 序列点 之前。在这种情况下,序列点出现在所有函数参数都被求值之后和函数被调用之前。