c= (getchar() != EOF)

3

我正在尝试解决 K&R 中的问题 1.6。

  • 验证表达式 getchar() != EOF 是否为 0 或 1。

我找到了一个可行的解决方案:

#include <stdio.h>

int main(){
   int expr_val, c;
   printf("Input a character and press enter: ");
   expr_val = (getchar() != EOF);
   printf("expr_val: %d\n", expr_val);

   return 0;
}

当我输入任何内容时,它返回值为1。当我执行EOF(Ctrl + D)时,它返回值为0。
然而,当我在代码中将EOF替换为数字,例如3,程序的运行结果并不符合我的期望。如果我输入5,则返回值为1。如果我输入3,则同样返回值为1。
根据我的理解,输入值为3应该返回一个与输入值为5不同的值。
(我只将EOF改为了3)
#include <stdio.h>

int main(){
   int expr_val, c;
   printf("Input a character and press enter: ");
   expr_val = (getchar() != 3);
   printf("expr_val: %d\n", expr_val);

   return 0;
}

有人能给我解释一下为什么会这样吗?


谢谢大家,你们的答案都非常清晰和有帮助。通过将EOF更改为“3”或51,代码正常工作。


8
3'3' 是不同的。查看ASCII表获取更多信息。 - R_Kapp
2
expr_val = (getchar() != 'A'); 请键入A - chux - Reinstate Monica
2
K&R问题有点愚蠢,至少对于标准C来说是这样。任何关系运算的结果(比如由!= 运算符执行的)都根据定义要么是0要么是1。 - John Bollinger
4个回答

2

您混淆了整数和字符。

3 不是字符 3,而是一个整数。在 C 语言中,'3' 才是字符 3。

文档在这里


2

getchar()函数返回读取的字符作为无符号字符强制转换为int或在文件结束或出错时返回EOF。

因此,您只需要更改比较并使用'3'(字符'3')而不是3,或者您可以使用数字3的ASCII值,即51。[参见 ASCII表]

expr_val = (getchar() != '3');

或者,
expr_val = (getchar() != 51);

现在,在这两种情况下,如果您输入3作为输入,您将得到expr_val = 0

C语言不保证使用ASCII,因此expr_val = (getchar() != 51);是错误的。而且魔数是一种不好的编程习惯。 - Stargateur
我同意,那么你有没有想要建议任何替代方案? - Wasi Ahmad
2
为什么你想要替代方案?'3'已经足够了。 - Stargateur

0

(getchar() != 3) 是一个布尔表达式。 因此,您的代码只会将0或1赋值给expr_val。


-1

2
atoi函数将以空字符结尾的字符串转换为整数。例如,将字符'3'转换为整数3只需减去字符'0'即可。但是,操作员不需要进行这种转换。 - M.M

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接