'\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)
,0
是 int
,而不是 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。
我在理解下面给出的 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)
,0
是 int
,而不是 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。