我从某处看到了以下代码:
while(*i++ = *j++)
{
}
但是这段代码在做什么?它的意义是什么?
它将元素从被调用的数组(或指向数组的指针)复制j
到被调用的i
. 它会这样做,直到找到一个j
等于零的值(来自 )。
这是复制 C 风格、以 null 结尾的字符串的常用习惯用法;它也可以用来复制一个以标记零结尾的整数数组。
j
如果可以提前知道的大小,最好使用memcpy()
. j
如果无法预先知道的大小,则代码很可能是不安全的,因为i
也不知道要分配的正确大小。
最有可能的是,如果 i 和 j 是 char*,那么它将以 null 结尾的字符串 j 复制到从 i 开始的内存中。您可能要记住 i 和 j 本身会更改 ( i += strlen(j)
),因此上面的代码也会破坏指向字符串的指针。
它将 j 指向的数据复制到 i 指向的数组中,并继续复制到值 0 被复制。它可能用于复制以空字符结尾的字符串。为了更聪明,您可以使用
while(*i++ = *j++);
*j++ 取消引用指针,增加它的值。
*i++ = *j++ 将 *j 的旧值赋给 *i,然后 *i++ 将该值递增并保存以备下次使用
while(*i++ = *j++)
被执行。
如果 i 和 j 是 char[],那么
while(*i++ = *j++)
正在将字符从 j[] 复制到 i[]直到达到 NULL 字符。
除了其他答案之外,while(*i++ = *j++){}
是一种可读性更差、更紧凑、更危险的写作方式
*i = *j;
while(*i != 0)
{
i++;
j++;
*i = *j;
}
这两种情况将生成完全相同的机器代码。
这主要取决于什么i
和j
是什么。一种情况可以如下。
假设i
andj
是两个指向字符串的指针,则i
and的值j
会同时增加,并赋值*j
as *i
,每当 的值j
变为0
ie 时,将其赋值给 *i\0
后循环退出。0
显然这可以用来复制 to 的j
内容i
。