'\0' != 0 不是真的吗?

Isn't '\0' != 0 true?

我在理解下面给出的 while 循环的条件时遇到了一些困难:

int main()
{
    char s[]="Let's Get it Started";
    int i=0;
    while(s[i]!=0)
    { 
       //do something
       ++i

    }
}

我知道字符串的最后一个字符存储为 [=13=],其 ASCII 值为 0。在 while 循环中,它比较数组中特定字符的值。所以当它达到 [=13=] 条件时就像

'[=11=]' != 0 // I guess this is also true

这不是死循环吗?

C 中,'[=11=]'0 具有相同的值(甚至类型)。两者都是具有 0 值的 int

So isn't this an infinite loop ?

所以,不,它不是无限循环,因为假设 [=15=]0 不同。但是对于不在这个问题范围内的其他因素,循环可能是无限的。

来自 C11 规范部分 5.2.1/2 字符集

A byte with all bits set to 0, called the null character, shall exist in the basic execution character set; it is used to terminate a character string.

可能你误入歧途了。你可以寻找 ASCII table, '[=11=]'-->0, '0'-->48.

在您的代码中,while(s[i] != 0)0int,而不是 char,因此 '[=16=]' == 0 is true

对了,你可以写下面的代码:

int a = '[=10=]';
int b = '0';
printf("%d  %d\n", a, b);

我相信你能清楚地知道问题所在。所以这不是无限循环。

您似乎混淆了 ascii 字母“0”和“\0”。第一个是 ascii 字符“0”,根据 ascii table,它具有等效数字 (48)。但是当在零 '\0' 之前使用转义符时,您使用的是空字符(与空数字不同),顺便说一句,它的所有位都归零。因此,所有位都设置为零的 ascii 字符与数字 0 相同。

因此,这不是无限循环,因为比较最后的空字符时,它等于数字0。