2014-10-08 67 views
-2
if (class == 'a','A') 

我試圖只在用戶輸入'a'或'A'時才繼續。每次構建它時,都會警告「逗號的左側操作數沒有任何影響」。警告:逗號左手操作數無效(c)

我對C非常陌生,所以我很抱歉,如果我不夠具體或缺少明顯的東西。

+5

我強烈建議您閱讀C書給初學者... – Jack 2014-10-08 21:10:29

+0

另請參閱http://stackoverflow.com/questions/13209399/c-what-does-int-x-anyint1-anyint2-mean – usr2564301 2014-10-08 21:11:07

+0

The [逗號運算符](http://en.wikipedia.org/wiki/Comma_o​​perator)不會做你認爲它的作用。 – sfstewman 2014-10-08 21:11:33

回答

4

,這不是如何做到這一點,你應該做的,而不是

if(class == 'a' || class == 'A') 
+0

非常感謝!你知道它爲什麼以其他方式工作,即使它錯了嗎? – Jeremy 2014-10-08 21:10:44

+3

@Jeremy:它沒有*工作*,但它確實編譯。 ','是*逗號運算符*。請查閱您的C語言教科書,以瞭解這意味着什麼。這個:'(class =='a','A')'相當於:'((class =='a'),'A')'。 – 2014-10-08 21:14:23

4

更改條件

if (class == 'a' || class == 'A') 

至於你的原始表達式

if (class == 'a','A') 

則使用逗號運算符,表達式的值爲'A'。由於'A'不等於零,因此條件將始終等於真。放棄逗號前的表達式。

1

雖然雙方目前的答案是正確的,我認爲這可能是更地道的事:

#include <ctype.h> 
... 
if (tolower(class) == 'a') 
{ 
    ... 
} 
0

if (class == 'a','A')中,左半是比較class == 'a'並且可以評估要麼truefalse(以布爾意義1)。 右半部分只是'A',它不等於0,因此不等於true。左半部分被評估,但結果未被使用。然後評估右半部分,其「結果」爲'A',即true。因此,代碼行爲,如果你寫

if (true) 
    ... 

您可以通過使用一個「0」,在右半檢查:

if (class == 'a', 0) 
    printf ("if-statement is true\n"); 
else 
    printf ("if-statement is false\n"); 

和運行這個(強迫編譯器來編譯後)確實會顯示「虛假」的路線。

編譯器抱怨,因爲左半部分class == 'a'「什麼都不做」:它對classif語句的結果沒有副作用。因此,編譯器會假定這是一個錯誤,因此會發出警告。這是一個警告,而不是一個錯誤,因爲語法是正確的。爲了便於比較,你允許寫類似這樣的東西作爲

if (class = 'a', 'A') 
    printf ("class == a,A seems to be true\n"); 
else 
    printf ("That didn't work.\n"); 

有效的副作用(class將獲取字符常量'a'值) - 但它也總是指出似乎是true,因爲後半部分是傳遞給if聲明的內容。


¹對於C,我用truefalse僅在布爾感,爲C在默認情況下不包括stdbool.h沒有這些命名值的概念(這個名字定義的常量)。但是,其基本概念是相同的:if語句評估其參數,如果其計算結果爲0(因此將不執行下列表達式),則該參數被認爲是false; true如果計算結果爲除0之外的任何值。