为什么getchar()在这两种情况下的工作方式不同?
问题描述:
我正在编写用于编码字符的小程序,而且在阅读NUL字符时也可能会遇到其他问题。我的问题是,代码中的getchar忽略CTRL + @输入的NUL字符。为什么getchar()在这两种情况下的工作方式不同?
while ((numberOfRead < 40) && (character = getchar()) && (character != EOF) && (character != '\n')) { ... }
但这个代码正常工作,正确读取NULL字符。
character = getchar();
while ((numberOfRead < 40) && (character != EOF) && (character != '\n')) {
numberOfChars++;
...
character = getchar();
}
导致问题的区别是什么?谢谢你对这种行为的任何解释。代码是在Windows 8.1测试,在GCC 4.7.1
答
这里:
while (... && (character = getchar()) && ...) ...
您使用的真值
character
值
。当读取character
是值为0的空字符时,此条件为false。
你可以这样做:
while (numberOfRead < 40
&& (character = getchar()) != EOF && character != '\n') { ... }
,但我觉得你与getchar
条件更具可读性之外的第二个变体。
+0
我完全忘记了评估任务:) – c0ntrol
+0
是的,很容易错过复合条件。 (这就是为什么我更喜欢你的第二个变体,因为它清楚了调用getchar的位置。) –
这就是为什么你应该避免在条件内赋值,使得编写错误非常容易。 – Lundin
^^^伦丁说的是什么。我看起来很聪明,很酷,但实际上并没有工作:(简单,一次一个代码,看似可避免的中间变量等导致工作,或者至少可调试,代码复杂,复合布尔表达式导致帖子到SO :( –
我很喜欢在这个条件下使用这个任务的想法,这是因为我在最近阅读过的K&R中的很多例子:) – c0ntrol