if (class == 'a','A')
我試圖只在用戶輸入'a'或'A'時才繼續。每次構建它時,都會警告「逗號的左側操作數沒有任何影響」。警告:逗號左手操作數無效(c)
我對C非常陌生,所以我很抱歉,如果我不夠具體或缺少明顯的東西。
if (class == 'a','A')
我試圖只在用戶輸入'a'或'A'時才繼續。每次構建它時,都會警告「逗號的左側操作數沒有任何影響」。警告:逗號左手操作數無效(c)
我對C非常陌生,所以我很抱歉,如果我不夠具體或缺少明顯的東西。
,這不是如何做到這一點,你應該做的,而不是
if(class == 'a' || class == 'A')
非常感謝!你知道它爲什麼以其他方式工作,即使它錯了嗎? – Jeremy 2014-10-08 21:10:44
@Jeremy:它沒有*工作*,但它確實編譯。 ','是*逗號運算符*。請查閱您的C語言教科書,以瞭解這意味着什麼。這個:'(class =='a','A')'相當於:'((class =='a'),'A')'。 – 2014-10-08 21:14:23
更改條件
if (class == 'a' || class == 'A')
至於你的原始表達式
if (class == 'a','A')
則使用逗號運算符,表達式的值爲'A'。由於'A'不等於零,因此條件將始終等於真。放棄逗號前的表達式。
雖然雙方目前的答案是正確的,我認爲這可能是更地道的事:
#include <ctype.h>
...
if (tolower(class) == 'a')
{
...
}
在if (class == 'a','A')
中,左半是比較class == 'a'
並且可以評估要麼true
或false
(以布爾意義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'
「什麼都不做」:它對class
或if
語句的結果沒有副作用。因此,編譯器會假定這是一個錯誤,因此會發出警告。這是一個警告,而不是一個錯誤,因爲語法是正確的。爲了便於比較,你是允許寫類似這樣的東西作爲
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,我用true
和false
僅在布爾感,爲C在默認情況下不包括stdbool.h
沒有這些命名值的概念(這個名字定義的常量)。但是,其基本概念是相同的:if
語句評估其參數,如果其計算結果爲0
(因此將不執行下列表達式),則該參數被認爲是false
; true
如果計算結果爲除0
之外的任何值。
我強烈建議您閱讀C書給初學者... – Jack 2014-10-08 21:10:29
另請參閱http://stackoverflow.com/questions/13209399/c-what-does-int-x-anyint1-anyint2-mean – usr2564301 2014-10-08 21:11:07
The [逗號運算符](http://en.wikipedia.org/wiki/Comma_operator)不會做你認爲它的作用。 – sfstewman 2014-10-08 21:11:33