所以这是工作版本:
#include <stdio.h>
int main(int argc, char const *argv[]) {
char myText[] = "hello world\n";
int counter = 0;
while(myText[counter]) {
printf("%c", myText[counter]);
counter++;
}
}
并在行动中:
Korays-MacBook-Pro:~ koraytugay$ gcc koray.c
Korays-MacBook-Pro:~ koraytugay$ ./a.out
hello world
我的问题是,为什么这段代码工作正常?何时(或如何)
while(myText[counter])
评估为假?
这两项工作也是如此:
while(myText[counter] != '\0')
while(myText[counter] != 0)
这个在控制台中打印垃圾:
while(myText[counter] != EOF)
,甚至不编译:
while(myText[counter] != NULL)
我可以看到'\0'
的工作原理,因为C在编译时将此字符放在数组的末尾。但为什么NULL
不起作用? 0 == '\0'
怎么样?
答案 0 :(得分:5)
AS的最后一个问题,
但为什么NULL不工作?
通常,NULL
是指针类型。此处,myText[counter]
是char
类型的值。根据使用==
运算符的条件,来自C11
标准,第6.5.9章,
以下其中一项应成立:
- 两个操作数都有算术类型;
- 两个操作数都是指向兼容类型的限定或非限定版本的指针;
- 一个操作数是指向对象类型的指针,另一个是指向合格或非限定版本的void的指针;要么
- 一个操作数是指针,另一个是空指针常量。
因此,它告诉您, 只能 将指针类型与空指针常量进行比较 ## (NULL
)。
之后,
while(myText[counter])
何时(或如何)评估为假?
很简单,当myText[counter]
的值为0
时。
详细说明,在初始化之后,myText
保存用于初始化它的字符值,使用&#34; null&#34;最后。 &#34; null&#34;是C标识字符串端点的方式。现在,null由值0
表示。所以,我们可以说。到达字符串结尾时,while()
FALSE 。
补充说明:
while(myText[counter] != '\0')
有效,因为'\0'
代表&#34; null&#34;用作字符串终止符。
while(myText[counter] != 0)
有效,因为0
是'\0'
的十进制值。
以上两个陈述均为while(myText[counter])
的等效。
while(myText[counter] != EOF)
不起作用,因为null不是EOF
。参考:(#)
参考:C11
标准,第6.3.2.3章,指针,第3段
值为
0
的整型常量表达式,或者类型为void *
的表达式,称为空指针常量。
,并从第7.19节开始,
NULL
它扩展为实现定义的空指针常量
注意:最后,如果您有任何问题,this question和实际答案将清除混淆。
答案 1 :(得分:2)
何时(或如何)这项工作?
while(myText[counter])
任何值为零的内置函数都将在布尔上下文中计算为false。因此,当while(myText[counter])
为myText[counter]
时,'\0'
为0
,其值为'\0'
。
如何0 =='\ 0'?
在语言中定义了这种方式。 int
是0
字面值,其值为零。 int
也是值为零的<from uri="activemq:queue:inqueue?concurrentConsumers=1"/
<camel:loadBalance inheritErrorHandler="false">
<camel:roundRobin/>
<camel:to uri="netty:tcp://0.0.0.0:0?logicalName=comp#1&sync=false"/>
<camel:to uri="netty:tcp://0.0.0.0:0?logicalName=comp#2&sync=false"/>
</camel:loadBalance>
字面值,因此两者都相等,并且它们在布尔上下文中都计算为false
答案 2 :(得分:2)
在C中,任何非零值的计算结果为true。 C字符串以空值终止。也就是说,字符串中的最后一个字符后面有一个特殊的零值字符。
所以当到达null终止符时,零值的计算结果为false,循环终止。
我可以看到为什么'\ 0'可以工作,因为C在编译时将这个字符放在我的数组的末尾。但是为什么NULL不起作用? 0 =='\ 0'怎么样?
0与'\ 0'具有相同的值,因为'\ 0'是值为零的字符。 (不要与'0'混淆,这是零数字,值为48。)
关于NULL
,它实际上可以工作,因为它也评估为零。但是,NULL
是指针类型,因此您可能必须键入强制转换以避免错误。 (很难确定,因为你没有发布你得到的错误。)
答案 3 :(得分:1)
如何0 =='\ 0'?
所有字符都有一个8位数字值,例如,'a'是97(十进制)。字符文字'\ 0'中的反斜杠引入了一个“转义”,通过其数值直接指定字符。在这种情况下,数值为0。
答案 4 :(得分:1)
\0
NULL
用于初始化指向确定值的指针while(myText[counter])
指向零字节, counter
的计算结果为false。
最后,字符串末尾的零字节没有什么不同。实际上NULL
意思相同,但仅在指针的上下文中用于表示法。
如果从编码角度看不清楚某些内容,您可能需要查看调试器监视窗口内部,程序执行期间实际有哪些位和字节。