7

我对这段代码感到困惑:(http://www.joelonsoftware.com/articles/CollegeAdvice.html

while (*s++ = *t++);

执行顺序是什么?*s = *t 首先完成,然后它们各自递增吗?或者其他方式?

谢谢。

编辑:如果它是:

while(*(s++) = *(t++));

while(++*s = ++*t);
4

7 回答 7

14
while (*s++ = *t++);

优先级表中您可以清楚地看到++优先级高于*. 但是++在这里用作后自增运算符,因此自增发生在赋值表达式之后。所以*s = *t首先发生,然后 s 和 t 递增。

编辑:

while(*(s++) = *(t++));

和上面一样。您使用括号使其更加明确。但记住++仍然是一个帖子增量。

while(++*s = ++*t);

s 旁边只有一个运算符。So*首先应用,然后++应用该结果,这会导致lvalue required错误。

while(*++s = *++t);

同样只是 s,t 旁边的运算符。所以增量首先发生,然后是复制。所以我们有效地跳过了从 t 到 s 的第一个字符的副本。

于 2010-02-09T04:09:35.707 回答
4

你说的对。*s = *t 先完成,然后递增。

于 2010-02-09T04:05:47.890 回答
2

增量是后增量。发布不仅因为它出现在变量被递增之后,还因为它出现在表达式被计算之后。所以执行顺序是

*s = *t

然后是 s++ 和 t++

于 2010-02-09T04:05:01.067 回答
1

编辑::

@chrisgoyal

执行顺序是一个模棱两可的术语。这里有两个不同的东西。句法顺序和表达式的语义。

在语法上,首先应用运算符 ++。如果先应用 *s,则以下内容等同于@Hogan 所说的:

(*s)++ = (*t)++

这与 Joel 的样本非常不同。

运算符 ++ 的语义是它在表达式之后执行。

希望能澄清我的肉。


实际上,s++并且t++首先应用。不要忘记后缀运算符是在表达式完成后执行的。基本上,运算符++适用于两者,然后 *s = *t被执行。

于 2010-02-09T04:05:32.580 回答
0

在 Post 增量操作中,首先使用变量,然后在其被修改后使用。

于 2010-02-09T04:07:51.350 回答
0

所以增量有两种形式

++s // increment before using value
s++ // increment after using value

这些结果可以被取消引用:

*++s // or...
*s++

这在最早运行 C 的机器之一 PDP-11 上运行得非常好,它具有寄存器间接寻址模式,可以在之后递增寄存器。以下操作在硬件中可用:

*--s // or
*s++

你可以做

*x++ = *y++; // or
*--x = *--y; // or some combination

如果你这样做了,整行就发生在一条指令中。但是,由于 // 注释是由 C99 引入的,因此您实际上无法摆脱我的注释语法。

于 2010-02-09T04:12:42.290 回答
0

代码:(while *s++ = *t++);大致相当于:

while (*s = *t) {
    ++s;
    ++t;
}

第二个是完全相同的——额外的括号不会改变任何东西(在这种情况下)。为了让parens做任何事情,他们必须像:while ((*s)++ = (*t)++);. 这将与您的第三个示例大致相同(在下面的段落中介绍)。

最后一个例子:while(++*s = ++*t);完全不同。由于解引用*(结果,这将复制第一个字符,然后增加该字符,然后检查该字符是否非零并继续相同直到它为零。结果将是源和目标都变成空字符串(因为两者的第一个字符现在都是零,用于终止字符串)。

于 2010-02-09T05:22:17.740 回答