2010-01-22 56 views
4
FILE *fd; 
if (fd=fopen(fileName,"r") == NULL) 
{ 
    printf("File failed to open"); 
    exit(1); 
} 

這是一段代碼片段。當我用gcc編譯它,我得到以下警告: -爲什麼我在「if(fd = fopen(fileName,」r「)== NULL)」中得到這個警告?

warning: assignment makes pointer from integer without a cast 

當我把FD =的fopen(的argv [2], 「R」)括號內,問題被解決..

我無法理解我在哪裏將整數轉換爲指針當括號不放。

回答

13

由於運算符優先級規則的條件被解釋爲fd=(fopen(fileName,"r") == NULL)==的結果是整數,fd是一個指針,因此是錯誤信息。

考慮你的代碼的「擴展」版本:

FILE *fd; 
int ok; 
fd = fopen(fileName, "r"); 
ok = fd == NULL; 
// ... 

你會想到最後一行被解釋爲(ok = fd) == NULL,或ok = (fd == NULL)

+0

這個答案實際上解釋了警告。 – 2010-01-22 14:11:54

-1

你做了以下幾件事嗎?

#include <stdio.h> 

沒有這一點,編譯器假定所有函數返回int

+0

mark downs沒有評論?不良形式幫助我從我的錯誤中學習。還要注意 - 這是一個問題,而不是一個斷言。 – 2010-01-22 15:02:28

1

您需要括號中的分配辦法:

if ((fd=fopen(fileName,"r")) == NULL) 
.... 
3

相等運算符的優先級比賦值運算符更高。只要你的代碼更改爲:

FILE *fd; 
if ((fd=fopen(fileName,"r")) == NULL) 
{ 
    printf("File failed to open"); 
    exit(1); 
} 
1

==具有比=更高的優先級,因此它的fopen()NULL結果進行比較,然後分配該至fd

1

==具有比=更高的優先級。

相關問題