我对这段代码感到困惑:(http://www.joelonsoftware.com/articles/CollegeAdvice.html)
while (*s++ = *t++);
执行顺序是什么?*s = *t 首先完成,然后它们各自递增吗?或者其他方式?
谢谢。
编辑:如果它是:
while(*(s++) = *(t++));
和
while(++*s = ++*t);
我对这段代码感到困惑:(http://www.joelonsoftware.com/articles/CollegeAdvice.html)
while (*s++ = *t++);
执行顺序是什么?*s = *t 首先完成,然后它们各自递增吗?或者其他方式?
谢谢。
编辑:如果它是:
while(*(s++) = *(t++));
和
while(++*s = ++*t);
while (*s++ = *t++);
从优先级表中您可以清楚地看到++
优先级高于*
. 但是++
在这里用作后自增运算符,因此自增发生在赋值表达式之后。所以*s = *t
首先发生,然后 s 和 t 递增。
编辑:
while(*(s++) = *(t++));
和上面一样。您使用括号使其更加明确。但记住++
仍然是一个帖子增量。
while(++*s = ++*t);
s 旁边只有一个运算符。So*
首先应用,然后++
应用该结果,这会导致lvalue required
错误。
while(*++s = *++t);
同样只是 s,t 旁边的运算符。所以增量首先发生,然后是复制。所以我们有效地跳过了从 t 到 s 的第一个字符的副本。
你说的对。*s = *t 先完成,然后递增。
增量是后增量。发布不仅因为它出现在变量被递增之后,还因为它出现在表达式被计算之后。所以执行顺序是
*s = *t
然后是 s++ 和 t++
编辑::
@chrisgoyal
执行顺序是一个模棱两可的术语。这里有两个不同的东西。句法顺序和表达式的语义。
在语法上,首先应用运算符 ++。如果先应用 *s,则以下内容等同于@Hogan 所说的:
(*s)++ = (*t)++
这与 Joel 的样本非常不同。
运算符 ++ 的语义是它在表达式之后执行。
希望能澄清我的肉。
实际上,s++
并且t++
首先应用。不要忘记后缀运算符是在表达式完成后执行的。基本上,运算符++
适用于两者,然后 *s = *t
被执行。
在 Post 增量操作中,首先使用变量,然后在其被修改后使用。
所以增量有两种形式
++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 引入的,因此您实际上无法摆脱我的注释语法。
代码:(while *s++ = *t++);
大致相当于:
while (*s = *t) {
++s;
++t;
}
第二个是完全相同的——额外的括号不会改变任何东西(在这种情况下)。为了让parens做任何事情,他们必须像:while ((*s)++ = (*t)++);
. 这将与您的第三个示例大致相同(在下面的段落中介绍)。
最后一个例子:while(++*s = ++*t);
完全不同。由于解引用*
(结果,这将复制第一个字符,然后增加该字符,然后检查该字符是否非零并继续相同直到它为零。结果将是源和目标都变成空字符串(因为两者的第一个字符现在都是零,用于终止字符串)。