2011-03-29 48 views
31

當我試圖編譯一塊下面的代碼,我得到這樣的警告:編譯器警告 - 建議各地分配括號用作真值

warning: suggest parentheses around assignment used as truth value

爲什麼會出現這種情況?我相信這是一個很常見的成語。我甚至在我的代碼中使用過類似的東西。

struct PIDList* 
getRecordForPID(struct PIDList* list, pid_t pid) { 
    while(list = list->next) 
     if (list->pid == pid) 
      return list; 

    return NULL; 
} 

感謝

編輯:謝謝您的回答。所有這些都非常相似,所以我會通過刷新頁面並點擊頂部的那一個來接受隨機的一個:P

+0

你可以自由關閉警告,或者說把它關閉... – 2011-03-29 17:54:56

+3

我有點心不在焉,所以我很感謝迂腐,-Wall,-Wextra,-Wshadow等 – 2011-03-29 18:03:02

+2

那麼你可以添加'-Wno-括號'(我相信這是正確的)來禁用這個特定的警告。但是,如果你是那個心不在焉的人,注意不要寫'='而不是'=='...... – 2011-03-29 18:08:50

回答

52

要明確 - 然後編譯器不會警告您可能犯了一個錯誤。

while ((list = list->next) != NULL) 

while ((list = list->next)) 

有一天你會很高興的編譯器告訴你,人犯類似的錯誤;)

+0

人們呢!出於這個原因,我曾經在C中編寫'if(0 == varName)',以便在錯誤輸入時可能會收到錯誤消息。 – jpaugh 2018-01-19 22:56:07

17

這只是一個 '安全' 的警告。這是一個比較常見的習慣用語,但是當你想要在那裏有==時,這也是一個相對常見的錯誤。您可以進行警告通過添加另一組括號消失:

while ((list = list->next)) 
+4

對於沒有'!= 0'或'!= NULL'的解決方案+1。 :-) – 2011-03-29 17:55:23

45

雖然該特定成語是常見的,更常見的是人們使用=時,他們的意思是==。當你真正的意思是該公約的=是用括號一層額外的:因爲它在默認情況下是關閉

while ((list = list->next)) { // yes, it's an assignment 
+3

這個答案對我來說比接受者更清楚,很好。 – gsamaras 2014-11-12 23:57:08