2012-11-13 310 views
1

該代碼給出了一個錯誤,說明if比較語句中的「沒有運算符匹配這兩個運算數」。我解釋,它應該意味着「一個節點不能被轉換/轉換爲一個整數」。但是,與%d格式一起使用時,print語句輸出w[2]的整數值。爲什麼會發生?是不是printf鑄造?將一個節點轉換爲整數

NODE *w=(NODE *)malloc(4*sizeof(NODE)); 
if(w[2]==0) 
    printf("%d\n",w[2]); 

是 -

struct node{ 
    int key; 
    struct node *father; 
    struct node *child[S]; 
    int *ss; 
    int current; 
}; 

請參考cdhowie的評論節點的結構。他已經回答了這個問題。

+4

打開編譯器警告。 – Mysticial

+0

你認爲'w [2] == 0'應該做什麼?比較(第三個)節點中的每個字段以查看它是否爲零?如果有浮球怎麼辦?如果有指針呢? – wallyk

+0

@wallyk但爲什麼它在printf中打印一個整數值? – halkujabra

回答

3

您看到的有關printf()的行爲未定義。 printf()不檢查類型參數;它假定您給出的參數與您在字符串參數中給出的格式說明符相匹配。

換句話說,您正在調用未定義的行爲。類型代碼%d需要int作爲參數,但是您指定的是NODE對象。任何事情都可能發生在這裏 - 例如,你的程序可能會崩潰(儘管這不太可能)。至少,你不能依賴這個特定的輸出在平臺或編譯器上保持一致。

如果您將編譯器的警告提高到最大值,它會警告您這一點。現代編譯器會爲你輸入檢查參數printf()(假設你提供了一個字符串作爲第一個參數,而不是一個變量或表達式),但這純粹是編譯時檢查,它只會產生警告,而不會產生錯誤。