//自我实现字符函数中的strcpy 功能
char* my_strcpy(char* destination, char* source)
{
assert(destination!= NULL);
assert(source!= NULL);
char* ret = destination;
while (*destination++ = *source++)//当 while 循环条件中有赋值运算时,循环的终止取决于等号左边的表达式。这是因为赋值运算符的返回值是左操作数
//,因此 while 循环的条件将根据左操作数的新值来评估。
{
;
}return ret;
}
int main()
{
char a1[] = "hello woc";
char a2[20] = "00000000";//这里为拷贝的目的地 要比拷贝源 大 所以要填上【20】
printf("%s\n",my_strcpy(a2, a1));//把a2中的字符串给改了
printf("%s\n", a2);//所以上下一样
return 0;
}
while循环会终止,因为它是受以下条件控制的:
while (*destination++ = *source++)
```
这个条件检查 `*destination` 是否不等于 `'\0'`(空字符)。如果 `*destination` 等于 `'\0'`,则条件为假,循环终止。
这是因为:
* `*destination++` 将 `destination` 指针递增,并返回 `*destination` 的当前值。
* `*source++` 将 `source` 指针递增,并返回 `*source` 的当前值。
当源数组中的所有字符都被复制到目标数组中时,`*source` 将等于 `'\0'`。此时,`*destination` 也将等于 `'\0'`,因为目标数组中的最后一个字符也是 `'\0'`。因此,条件 `*destination++ = *source++` 将为假,循环将终止。
总而言之,循环会终止,因为它是受源数组中字符可用性的条件控制的。当源数组中的所有字符都被复制到目标数组中时,循环将终止。循环将执行以下步骤:
1. 将 'H' 从 source 复制到 destination。
2. 将 'e' 从 source 复制到 destination。
3. 将 'l' 从 source 复制到 destination。
4. 将 'l' 从 source 复制到 destination。
5. 将 'o' 从 source 复制到 destination。
6. 将 null 字符('\0')从 source 复制到 destination。
此时,destination 数组包含字符串 "Hello\0",其中 '\0' 是 null 字符,表示字符串的结尾。循环检测到 null 字符并终止。
当while循环条件中有像上面代码一样的赋值运算时while的终止取决于等号左边还是右边
因此,循环通过使用 null 字符作为终止符和递增指针来确保在复制完源数组中的所有字符后终止。
**while 循环条件中有赋值运算时,循环的终止取决于等号的**左边**。**
这是因为赋值运算符 (=) 的返回值是**左操作数**。因此,在 while 循环条件中,等号左边的表达式将被求值,并且该值将与等号右边的表达式进行比较。
例如,在代码片段中:
```c
while (*destination++ = *source++)
```
等号左边的表达式是 `*destination++`。这个表达式将对 `*destination` 进行赋值,然后将 `destination` 指针递增。因此,while 循环的条件将根据 `*destination` 的新值来评估。
如果 `*destination` 的新值不等于 0(假),则循环将继续。如果 `*destination` 的新值等于 0(真),则循环将终止。
因此,在这个例子中,循环的终止取决于 `*destination` 的值,这是等号左边的表达式。
**总结:**
当 while 循环条件中有赋值运算时,循环的终止取决于等号**左边**的表达式。这是因为赋值运算符的返回值是左操作数,因此 while 循环的条件将根据左操作数的新值来评估。