我自己开始学习编程(C)作为一种爱好.我正在使用K&R.
main()
{
int c;
while ((c = getchar()) != EOF)
putchar(c);
}
Run Code Online (Sandbox Code Playgroud)
验证getchar()!= EOF是0还是1
我想我明白发生了什么:
但是,我的解决方案是错误的,所以显然我不明白:
main ()
{
int c;
while ((c = getchar()) != EOF)
printf("%d\n", c);
}
Run Code Online (Sandbox Code Playgroud)
这只是打印字符的值.如果按回车键,也会打印"10".
我以为它会打印c.但是,它是打印字符的值而不是1或0值.
我知道在将其与EOF进行比较后,c被赋予1或0.但我不确定我可以使用什么逻辑来表明这一点.看来我需要以某种方式"退出"显示字符值,而是显示比较值.这是否意味着我需要离开while循环?如果是这样,我不知道如何(这只是猜测).
我怎样才能简单地验证c = 1还是0?
而且,我怎么知道这个?我想,必须有一些基本的东西,我应该从中学习.
main ()
{
int c;
while ((c = getchar()) != EOF != 0 != 1)
putchar(c);
}
Run Code Online (Sandbox Code Playgroud)
我也这样做了,我认为这似乎有效.因为它不输出任何字符,但我不确定这是否是他们正在寻找的解决方案......
nou*_*ney 11
我知道在将其与EOF进行比较后,c被赋予1或0
不,不是.看:
while ((c = getchar()) != EOF)
Run Code Online (Sandbox Code Playgroud)
表达式是:(c = getchar()) != EOF
,它包含另一个表达式:(c = getchar())
,它c
从键盘分配给角色.c
不会等于0或1!这是表达的结果.试试这段代码:
int main()
{
char value;
int c;
value = ((c = getchar()) != EOF);
printf("%i\n", value);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
此代码将打印表达式的值(c = getchar()) != EOF
.实际上,您的代码可以这样写:
int main ()
{
int c;
char value = ((c = getchar()) != EOF);
while (value)
{
printf("%d\n", c);
value = ((c = getchar()) != EOF);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
该表达式while
不再存在,其结果已分配给value
.上面的代码和你的代码将产生完全相同的输出.
编辑:
`main ()
{
int c;
while ((c = getchar()) != EOF != 0 != 1)
putchar(c);
}`
Run Code Online (Sandbox Code Playgroud)
这不是解决方案!这是重写的代码:
`main ()
{
int c;
char value1;
char value2;
char value3;
value1 = ((c = getchar()) != EOF);
value2 = value1 != 0;
value3 = value2 != 1;
while (value3)
{
putchar(c);
value1 = ((c = getchar()) != EOF);
value2 = value1 != 0;
value3 = value2 != 1;
}
}`
Run Code Online (Sandbox Code Playgroud)
那会发生什么?让我们说getchar
将返回字符'A'.所以value1
将等于1,因为'A'不同于EOF
.value2
将等于1,因为value1
(其等于1)大于0不同value3
将等于0,因为value2
(其等于1)是不不同于1:while(value3)
现在while(0)
,所以没有字符将被打印.
重要的是要理解您可以为变量赋予比较表达式的结果(这意味着具有至少一个比较运算符的表达式),并且此类表达式的结果为0(对于false)或1(对于true) .
关于OP评论的几句话:
嘿,谢谢.但K&R明确表示"这会产生将c设置为1或0"的不良影响.也许这就是为什么我很困惑.
c
如果while
看起来像这样,将被分配为0或1 :
while (c = getchar() != EOF)
Run Code Online (Sandbox Code Playgroud)
运营商!=
的优先级高于运营商=
.这意味着getchar() != EOF
将首先评估,然后将其结果分配给c
.
我意识到这个问题是陈旧的,但选定的答案正在回答的问题不是那个问题的问题.(这是从书中提出的另一个问题)我在这里澄清一些事情,并希望从谷歌搜索这个问题的其他人可以阅读我的答案,以便更好地理解来自C编程语言的问题1-6版.
陈述的问题验证了getchar()!= EOF是0还是1
这本书暗示了这一点
**c = (getchar() != EOF)**
相当于
**c = getchar() != EOF**
什么时候getchar() != EOF
测试,
如果输入不是 EOF
,那么它应该是真的,因此返回a True
或者1
在这个意义上.
当然,如果是 输入EOF
,那么getchar() != EOF
将返回a False
或a 0
.
这就是为什么无论是1
或0
将被分配到c
.
对于书中提到的"不良影响",因为既不是原始输入1
也不0
是原始输入,这意味着要输出的原始字符丢失,这是不希望的.
对于练习,请使用:
#include <stdio.h>
main()
{
int c;
while ( c = getchar() != EOF ) {
printf("%d\n", c);
}
}
Run Code Online (Sandbox Code Playgroud)
如果您的输入不是EOF
,那么它将打印1
.
如果输入是EOF
,则程序结束.
注意:要EOF
在Windows中键入,请使用Ctrl + Z
编辑:
K&R练习1.6的简单解决方案.
printf("%d", getchar() != EOF);
Run Code Online (Sandbox Code Playgroud)