2010-01-22 35 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

==具有比=更高的优先级。

相关问题