1

我从某处看到了以下代码:

while(*i++ = *j++)
{
}

但是这段代码在做什么?它的意义是什么?

4

6 回答 6

4

它将元素从被调用的数组(或指向数组的指针)复制j到被调用的i. 它会这样做,直到找到一个j等于零的值(来自 )。

这是复制 C 风格、以 null 结尾的字符串的常用习惯用法;它也可以用来复制一个以标记零结尾的整数数组。

j如果可以提前知道的大小,最好使用memcpy(). j如果无法预先知道的大小,则代码很可能是不安全的,因为i也不知道要分配的正确大小。

于 2013-10-10T14:34:30.107 回答
3

最有可能的是,如果 i 和 j 是 char*,那么它将以 null 结尾的字符串 j 复制到从 i 开始的内存中。您可能要记住 i 和 j 本身会更改 ( i += strlen(j)),因此上面的代码也会破坏指向字符串的指针。

于 2013-10-10T14:35:25.780 回答
2

它将 j 指向的数据复制到 i 指向的数组中,并继续复制到值 0 被复制。它可能用于复制以空字符结尾的字符串。为了更聪明,您可以使用

while(*i++ = *j++);
于 2013-10-10T14:34:41.170 回答
1

*j++ 取消引用指针,增加它的值。

*i++ = *j++ 将 *j 的旧值赋给 *i,然后 *i++ 将该值递增并保存以备下次使用

while(*i++ = *j++)

被执行。


如果 i 和 j 是 char[],那么

while(*i++ = *j++)

正在将字符从 j[] 复制到 i[]直到达到 NULL 字符。

于 2013-10-10T14:37:38.947 回答
1

除了其他答案之外,while(*i++ = *j++){}是一种可读性更差、更紧凑、更危险的写作方式

*i = *j;

while(*i != 0)
{
  i++;
  j++;
  *i = *j;
}

这两种情况将生成完全相同的机器代码

于 2013-10-10T15:13:49.900 回答
0

这主要取决于什么ij是什么。一种情况可以如下。

假设iandj是两个指向字符串的指针,则iand的值j会同时增加,并赋值*jas *i,每当 的值j变为0ie 时,将其赋值给 *i\0后循环退出。0

显然这可以用来复制 to 的j内容i

于 2013-10-10T14:42:53.010 回答