我在理解下面给出的while
循环的条件时遇到了一些困难:
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
所以这不是一个无限循环吗?
答案 0 :(得分:4)
在C
中,'\0'
与0
具有相同的值(甚至类型)。两者都是int
,0
值。
所以这不是一个无限循环吗?
所以,不是因为假设\0
和0
不同而不是无限循环。但是对于不在本问题范围内的其他因素,这些循环可能会被激活。
来自 C11 规格部分 5.2.1 / 2字符集
所有位都设置为0的字节,称为空字符,应存在 在基本执行字符集中;它用于终止一个 字符串。
答案 1 :(得分:1)
也许你遇到了错误。你可以寻找ASCII表'\0'-->0, '0'-->48
。
在您的密码while(s[i] != 0)
中,0
为int
,而不是char
,因此'\0' == 0 is true
。
顺便说一句,您可以在下面编写代码:
int a = '\0';
int b = '0';
printf("%d %d\n", a, b);
我相信你可以清楚地知道这些问题。所以这不是一个无限循环。
答案 2 :(得分:1)
你似乎在ascii字母'0'和'\ 0'之间产生了一些混淆。第一个是ascii字符'0',根据ascii表有一个等价的数字(48)。但是当在零'\ 0'之前使用转义栏时,您使用的是空字符(与空数不同),顺便说一下,它的所有位都归零。因此,将其所有位设置为零的ascii字符与数字0相同。
因此,这不是一个无限循环,因为在比较结尾的空字符时,它等于数字0.