2012-08-16 77 views
2

我一直在通过K & R在C编程语言中的一些例子,但我对我在练习1-12中做过的测试感到困惑我切换了if和else语句。切换如果和否则不会产生相同的结果

问题是:编写一个程序,每行打印一个字的输入。

所以基本上要测试出\ n而忽略单词之间的多个空格,我首先写了这个。

#include <stdio.h> 

int main() 
{ 
    int c; 

    while ((c = getchar()) != EOF) { 
     if (c == ' ' || c == '\t') { 
      printf("\n"); 

     } 
     else { 
      putchar(c); 
     } 

    } 
} 

在这其中,就在看到空格或制表符打印出一个新的段落,如果没有,然后将其复制完全输入。

此代码产生了我想要的结果(当然还有来自多余的空格中输入单词之间还额外段落,但我忽略了现在)

然后,我决定看看发生了什么,如果我切换我的if和else语句在改变条件的时候,但事实证明结果是不一样的。

#include <stdio.h> 

int main() 
{ 
    int c; 

    while ((c = getchar()) != EOF) { 
     if (c != ' ' || c != '\t') { 
      putchar(c); 
     } 
     else { 
      printf("\n"); 
     } 

    } 

} 

在这一个,我希望它打印出不是空白或选项卡,如果不是,它会创建一个新的段落。

我预计新的条件会产生相同的结果。相反,它只是复制我输入的内容。有谁知道为什么这不起作用?

回答

9
if (c != ' ' || c != '\t') { 

这种情况进行检查以查看是否c要么不是空格,c不是标签。这总是如此,因为c不能同时是空格和标签。请尝试:

if (c != ' ' && c != '\t') { 

您可以在De Morgan's Laws更详细地阅读此原则。

另一种方法是让编译器做的逻辑否定你:

if (!(c == ' ' || c == '\t')) { 

然而,有些人(包括我)就认为很难,因为额外的括号和对微小!读剩下。

+0

我想你是指'if(!(c ==''|| c =='\ t')){'。 :-) – MRAB 2012-08-16 22:23:22

+0

@MRAB:哦,天啊。谢谢! – 2012-08-16 22:23:55

+0

我看到现在发生了什么事。这一个让我陷入了一段时间。谢谢! – user1604449 2012-08-16 22:28:58

2

的反面:

if (c == ' ' || c == '\t') { 

(参数c或者是一个空格或标签)

是:

if (c != ' ' && c != '\t') { 

(参数c既不是空间,也不是标签)

||应该是陈成为&&

+0

感谢您的回复!现在有道理。 – user1604449 2012-08-16 22:29:25

相关问题