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