C语言\0与0的区别 以及while的判断

BadBlood1984
  • 102

while("\0")为什么会跳出
以下的while为什么又会跳出呢,因为以前是写PHP的不太理解,赋值不是一直会为真的吗?

请输入代码/* strcpy: 将 t 复制到s;指针版 3 */
 void strcpy(char *s, char *t)
  {     
      while (*s++ = *t++)         ; 
  } 
回复
阅读 8k
6 个回答
wangdai
  • 1k

这个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

araraloren
  • 3.5k
while("\0")

这条语句判断的是"\0"的值,在C里面也就是"\0"的地址,这个条件会造成死循环,除非"\0"的地址为0,在MINGW32环境下测试如此

while (*s++ = *t++);

这条语句判断的是赋值表达式的返回值,C里面赋值表达式返回的是左操作数的值,t和s是正确的字符串的情况下,最后一步会有 *s = '\0';发生,这时候ASCII '\0' 的值为0,循环退出

bf
  • 8k

'\0' 是 char
0 是 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 的結果。

tiyee
  • 1.8k
'\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');

我也是新手。。勿喷

C中,赋值语句的值,为赋值符号(=)左边的值;
不是一直为真的。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏