2012-08-16 161 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

相關問題