C Isn';t'\0';!=真的吗?
我在理解C Isn';t'\0';!=真的吗?,c,string,ascii,infinite-loop,nul,C,String,Ascii,Infinite Loop,Nul,我在理解循环的条件时遇到一些困难,而循环如下所示: int main() { char s[]="Let's Get it Started"; int i=0; while(s[i]!=0) { //do something ++i } } 我知道字符串与最后一个字符一起存储为\0,其ASCII值为0。在while循环中,它比较数组中特定字符的值。因此,当它达到\0条件时 '\0' != 0 // I guess this
循环的条件时遇到一些困难,而循环如下所示:
int main()
{
char s[]="Let's Get it Started";
int i=0;
while(s[i]!=0)
{
//do something
++i
}
}
我知道字符串与最后一个字符一起存储为\0
,其ASCII值为0
。在while
循环中,它比较数组中特定字符的值。因此,当它达到\0
条件时
'\0' != 0 // I guess this is also true
这不是一个无限循环吗?在C
中,'\0'
与0
具有相同的值(甚至类型)。两者都是具有0
值的int
s
这不是一个无限循环吗
因此,不,它不是一个无限循环,因为假设\0
和0
是不同的。但对于不在本问题范围内的其他因素,循环可能是无限的
从C11规格部分5.2.1/2字符集
应存在所有位均设置为0的字节,称为空字符
在基本执行字符集中;它用于终止
字符串
也许你犯了错误。您可以查找ASCII表,'\0'-->0,'0'-->48
在代码中,while(s[i]!=0)
,0
是int
,而不是char
,因此'\0'==0是真的
顺便说一下,您可以编写以下代码:
int a = '\0';
int b = '0';
printf("%d %d\n", a, b);
我相信你能清楚地知道这些问题。所以它不是一个无限循环。您似乎对ascii字母“0”和“\0”有点混淆。第一个是ascii字符“0”,根据ascii表,该字符有一个等效的数字(48)。但是,当使用零“\0”之前的转义栏时,您使用的是空字符(与空数字不同),顺便说一下,它的所有位都为零。因此,所有位均设置为零的ascii字符与数字0相同
因此,这不是一个无限循环,因为当比较末尾的空字符时,它等于数字0。'\0'=0
为false。是的,这是一个无限循环,因为你不增加i
'\0'
与'0'
@CoolGuy不同,我现在编辑了这个问题,没有增加,我是一个打字错误,我不知道怎么做\0=0为false
@Patel,原因与'a'!=97
为假。参见和@Patel:If'\0'
等于0
和=代码>表示“不相等”,则“\0”!=0
不是真的。“不正确”等于“错误”。所以“\0”!=0
为“false”。那么“\0”为空字符,ASCII值为0,0的ASCII值为48,因此在上述情况下,条件0被视为字符文本rt,ASCII值为48?@Patel0
和'0'
不同0
等于'\0'
,两者都不等于'0'
。