while("\0")为什么会跳出
以下的while为什么又会跳出呢,因为以前是写PHP的不太理解,赋值不是一直会为真的吗?
请输入代码/* strcpy: 将 t 复制到s;指针版 3 */
void strcpy(char *s, char *t)
{
while (*s++ = *t++) ;
}
while("\0")为什么会跳出
以下的while为什么又会跳出呢,因为以前是写PHP的不太理解,赋值不是一直会为真的吗?
请输入代码/* strcpy: 将 t 复制到s;指针版 3 */
void strcpy(char *s, char *t)
{
while (*s++ = *t++) ;
}
while("\0")
这条语句判断的是"\0"的值,在C里面也就是"\0"的地址,这个条件会造成死循环,除非"\0"的地址为0,在MINGW32环境下测试如此
while (*s++ = *t++);
这条语句判断的是赋值表达式的返回值,C里面赋值表达式返回的是左操作数的值,t和s是正确的字符串的情况下,最后一步会有 *s = '\0';发生,这时候ASCII '\0' 的值为0,循环退出
'\0'
是 char0
是 int
char 和 int 的差異只是對你而言,在內存當中都是 int。
在內存當中,'\0'
就是 0
。
0
就是布爾邏輯中的 FALSE
。
所以 while ('\0')
相當於 while (false)
另外,別忘了 PHP 中的賦值是左結合,居然是左結合,a = b = c
居然相當於 (a = b) = c
。。。
還有誰告訴你賦值一定爲真。。。
就連 PHP 都是可以 if (a = (b = (c = 0))) return; // never execute
賦值表達式的結果,取決於 right-hand side expression 的結果。
'\0'是字符串结束的标志,因为ASCII码值为0,一般编译器会定义NULL的值为0,字符的运算其实是操作的ascii值,当读取到'\0'的时候,返回的ascii是0,表示到了字符串的结尾,其他的任何字符常量的ASCII码值都是大于0的,返回的是一个大于0的数字,c语言里的字符串是由字符组成的,字符都有ascII值,我们看到的字符和数字都是ascii值格式化输出的结果,当然,不是所有字符都是可见的,'\0'就是一个不可见的字符常量。
题主你是想问while('\0')为什么会跳出循环吧?
因为'\0'的ASCII码等于0啊。 就相对于while(0),条件为假当然跳出循环咯。
void Strcpy(char s, char *t)
{
while (s++ = t++)
;
}
这个函数中,当循环到t == '\0'时,赋值给s,同时判断s等于0,跳出循环。
while (s++ = *t++) ; 其实可以等价于while(((s++)=*(t++))!='\0');
我也是新手。。勿喷
1.1k 阅读
173 阅读
这个while判断的是
*s++ = *t++
表达式的值对,没错,C语言里的表达式也是有值的,比如逗号表达式的值
1, 2, 3
的值等于最右边数的值即3这个赋值表达式的值也是等于赋值完后的左值即
*s++
,也即当前*s
的值所以当t到达末尾的时候会读到字符串结尾的0,即
*t
为0,被赋值的*s
也是0,while里面是个0自然会跳出循环另外
'\0'
的值为0,所以while('\0')
会跳出循环另外
while("\0")
不会跳出循环,因为字符串常量的值实际山是它的地址,字符串常量的地址都不会是0