为什么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

+1

这就是为什么你应该避免在条件内赋值,使得编写错误非常容易。 – Lundin

+0

^^^伦丁说的是什么。我看起来很聪明,很酷,但实际上并没有工作:(简单,一次一个代码,看似可避免的中间变量等导致工作,或者至少可调试,代码复杂,复合布尔表达式导致帖子到SO :( –

+0

我很喜欢在这个条件下使用这个任务的想法,这是因为我在最近阅读过的K&R中的很多例子:) – c0ntrol

这里:

while (... && (character = getchar()) && ...) ... 
您使用的真值 character

。当读取character是值为0的空字符时,此条件为false。

你可以这样做:

while (numberOfRead < 40 
     && (character = getchar()) != EOF && character != '\n') { ... } 

,但我觉得你与getchar条件更具可读性之外的第二个变体。

+0

我完全忘记了评估任务:) – c0ntrol

+0

是的,很容易错过复合条件。 (这就是为什么我更喜欢你的第二个变体,因为它清楚了调用getchar的位置。) –