(练习1.6 K&R)如何验证getchar()!= EOF是0还是1?

BBe*_*dit 11 c eof getchar

我自己开始学习编程(C)作为一种爱好.我正在使用K&R.

 main()
{
int c;
while ((c = getchar()) != EOF)
putchar(c);
}
Run Code Online (Sandbox Code Playgroud)

验证getchar()!= EOF是0还是1

我想我明白发生了什么:

  1. c从键盘分配下一个字符
  2. c检查是否是EOF
  3. c被指定为1或0,具体取决于它是否为EOF.
  4. 字符显示在输出上,或者如果EOF结束程序.

但是,我的解决方案是错误的,所以显然我不明白:

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.

  • @ user2071506啊来吧:)这是完全正常的!实际上K&R不是为初学者设计的.这是最好的书之一,但它假设你已经有一些编程经验.`C`语言不是学习编程的简单语言,但如果你知道它,你就可以知道一切;) (2认同)

Say*_*ora 5

我意识到这个问题是陈旧的,但选定的答案正在回答的问题不是那个问题的问题.(这是从书中提出的另一个问题)我在这里澄清一些事情,并希望从谷歌搜索这个问题的其他人可以阅读我的答案,以便更好地理解来自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.

这就是为什么无论是10将被分配到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)