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

前端之家收集整理的这篇文章主要介绍了(练习1.6 K&R)如何验证getchar()!= EOF IS 0或1?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我刚刚开始学习编程(C)作为一个爱好,我自己.我正在使用K& R.
  1. main()
  2. {
  3. int c;
  4. while ((c = getchar()) != EOF)
  5. putchar(c);
  6. }

Verify that getchar() != EOF IS 0 OR 1

我想我明白发生了什么:

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

但是,我的解决方案是错误的,所以很清楚,我不了解某些东西:

  1. main ()
  2. {
  3. int c;
  4.  
  5. while ((c = getchar()) != EOF)
  6. printf("%d\n",c);
  7. }

这只是打印字符的值.如果我按回车键,也打印“10”.

我以为会打印c.但是,它正在打印字符的值而不是1或0的值.

我知道c与EOF进行比较后分配1或0.但我不知道可以用什么逻辑来显示这个.似乎我需要以某种方式“显示显示字符值,而是显示比较值.这是否意味着我需要摆脱while循环?如果是这样,我不知道如何(这只是一个猜测).

我怎样才能验证c = 1或0?

而且,我该怎么知道这个?我想,我应该从中学到一些根本的东西.

  1. main ()
  2. {
  3. int c;
  4.  
  5. while ((c = getchar()) != EOF != 0 != 1)
  6. putchar(c);
  7. }

我也这样做,我觉得这似乎很有效.因为它不输出任何字符,但我不知道这是否是他们正在寻找的解决方案…

解决方法

I know c is assigned 1 or 0 after comparing it with EOF

不,不行看:

  1. while ((c = getchar()) != EOF)

表达式是:(c = getchar())!= EOF,其中包含另一个表达式:(c = getchar()),它从键盘分配给c的字符. c不会等于0或1!这是表达的结果.尝试这段代码

  1. int main()
  2. {
  3. char value;
  4. int c;
  5. value = ((c = getchar()) != EOF);
  6. printf("%i\n",value);
  7. return 0;
  8. }

代码将打印表达式的值(c = getchar())!= EOF.其实你的代码可以这样写:

  1. int main ()
  2. {
  3. int c;
  4. char value = ((c = getchar()) != EOF);
  5. while (value)
  6. {
  7. printf("%d\n",c);
  8. value = ((c = getchar()) != EOF);
  9. }
  10. return 0;
  11. }

该表达式不再在同一时间,其结果被赋值给值.上面的代码和你的代码将会产生完全相同的输出.

编辑:

  1. `main ()
  2. {
  3. int c;
  4.  
  5. while ((c = getchar()) != EOF != 0 != 1)
  6. putchar(c);
  7. }`

这不是解决方案!这里是重写的代码

  1. `main ()
  2. {
  3. int c;
  4. char value1;
  5. char value2;
  6. char value3;
  7.  
  8. value1 = ((c = getchar()) != EOF);
  9. value2 = value1 != 0;
  10. value3 = value2 != 1;
  11. while (value3)
  12. {
  13. putchar(c);
  14. value1 = ((c = getchar()) != EOF);
  15. value2 = value1 != 0;
  16. value3 = value2 != 1;
  17. }
  18. }`

那么会发生什么?
假设getchar会返回字符“A”.所以value1将等于1,因为’A’不同于EOF. value2将等于1,因为value1(等于1)不等于0. value3将等于0,因为value2(等于1)不等于1:while(value3)现在是(0),所以不会打印任何字符.

重要的是要理解,您可以将变量分配给比较表达式的结果(这意味着至少有一个比较运算符的表达式),并且此类表达式的结果为0(对于false)或1(为true) .

关于OP的评论的话很少

Hey,thanks. But K&R explicitly says “This has the undesired effect of setting c to 1 or 0”. Maybe this is why I’m confused.

如果while看起来像这样,c将被分配到0或1:

  1. while (c = getchar() != EOF)

operator =具有比operator =更大的优先级.这意味着getchar()!= EOF将首先进行评估,然后将其结果分配给c.

猜你在找的C&C++相关文章