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

これはコードスニペットです。gccでコンパイルすると、次の警告が表示されます。-

warning: assignment makes pointer from integer without a cast

fd = fopen(argv [2]、 "r")を角かっこで囲むと、問題は解決します。

角かっこを付けないと、整数をポインタに変換する場所がわかりません。

4

6 に答える 6

14

演算子の優先順位規則により、条件はとして解釈されfd=(fopen(fileName,"r") == NULL)ます。の結果==は整数でfdあり、ポインタであるため、エラーメッセージが表示されます。

コードの「拡張」バージョンを検討してください。

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

(ok = fd) == NULL最後の行が、、またはとして解釈されることを期待しますかok = (fd == NULL)

于 2010-01-22T14:09:05.813 に答える
3

等式演算子の優先順位は、代入演算子よりも高くなっています。コードを次のように変更するだけです。

FILE *fd;
if ((fd=fopen(fileName,"r")) == NULL)
{   
    printf("File failed to open");
    exit(1);
}
于 2010-01-22T14:08:35.973 に答える
2

==はよりも優先順位が高い=ため、の結果をと比較fopen()NULL、それをに割り当てfdます。

于 2010-01-22T14:09:15.837 に答える
1

割り当てを括弧で囲む必要があります。

if ((fd=fopen(fileName,"r")) == NULL)
....
于 2010-01-22T14:08:15.853 に答える
1

==は=よりも優先度が高くなります。

于 2010-01-22T14:09:39.157 に答える
-1

次のことをしましたか?

#include <stdio.h>

これがないと、コンパイラはすべての関数がを返すと想定しますint

于 2010-01-22T14:08:10.393 に答える