为什么我在“if(fd = fopen(fileName,”r“)== NULL)”中得到这个警告?
问题描述:
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”)括号内,问题被解决..
我无法理解我在哪里将整数转换为指针当括号不放。
答
由于运算符优先级规则的条件被解释为fd=(fopen(fileName,"r") == NULL)
。 ==
的结果是整数,fd
是一个指针,因此是错误信息。
考虑你的代码的“扩展”版本:
FILE *fd;
int ok;
fd = fopen(fileName, "r");
ok = fd == NULL;
// ...
你会想到最后一行被解释为(ok = fd) == NULL
,或ok = (fd == NULL)
?
答
你做了以下几件事吗?
#include <stdio.h>
没有这一点,编译器假定所有函数返回int
。
+0
mark downs没有评论?不良形式帮助我从我的错误中学习。还要注意 - 这是一个问题,而不是一个断言。 – 2010-01-22 15:02:28
答
您需要括号中的分配办法:
if ((fd=fopen(fileName,"r")) == NULL)
....
答
相等运算符的优先级比赋值运算符更高。只要你的代码更改为:
FILE *fd;
if ((fd=fopen(fileName,"r")) == NULL)
{
printf("File failed to open");
exit(1);
}
答
==
具有比=
更高的优先级,因此它的fopen()
到NULL
结果进行比较,然后分配该至fd
。
答
==具有比=更高的优先级。
这个答案实际上解释了警告。 – 2010-01-22 14:11:54