ファイルを読み込む時は,まず
FILE *fp = fopen("hoge","r");
とすると思います.
その後のエラー処理について,
if(fp==NULL)
…
と習ったのですが,
if(!fp)
…
としているソースを見かけました.
実行してみると確かに動きましたが,
これは何を評価しているのでしょうか?
また,バグになる可能性のない安全なコードなのでしょうか?
fopenの返り値について
-
kazuoni
-
Dixq (管理人)
Re:fopenの返り値について
C言語においてどのように定義されているかは他の方に任せます。
大抵のコンパイラでは
#define NULL ((void*)0)
と定義されているようです。汎用ポインタ型の0ですね。
また、他トピの回答内容と同じになりますが、
判定式は真か偽かで判定されますよね。
if(真){
//
}
はいつも実行されますが
if(偽){
//
}
はいつも実行されませんね。では「!(=否定)」をつけるとどうなるか
if(!真){
//
}
はいつも実行されません。
if(!偽){
//
}
はいつも実行されます。そして真とは0以外、偽とは0であることから、
if(!0){
//
}
はいつも実行されます。そこで
if(!fp){
//
}
の成す意味は、「fpが0なら実行し、0以外なら実行しない」と言う意味になります。-
木霊
Re:fopenの返り値について
自分の持っている辞典では NULL の定義例として、
#define NULL (void *)0
とあります。 また、以前は「0」に定義されている事もあったようです。
ですから、
if(fp==NULL){オープン失敗} は
if ( fp == 0 ) { オープン失敗 } になり、さらに「!」が否定演算子なので
if ( !fp ) { オープン失敗 }// fp が NULL なら()内が真になる
という形に出来るようです
#define NULL (void *)0
とあります。 また、以前は「0」に定義されている事もあったようです。
ですから、
if(fp==NULL){オープン失敗} は
if ( fp == 0 ) { オープン失敗 } になり、さらに「!」が否定演算子なので
if ( !fp ) { オープン失敗 }// fp が NULL なら()内が真になる
という形に出来るようです