ファイルを読み込む時は,まず
FILE *fp = fopen("hoge","r");
とすると思います.
その後のエラー処理について,
if(fp==NULL)
…
と習ったのですが,
if(!fp)
…
としているソースを見かけました.
実行してみると確かに動きましたが,
これは何を評価しているのでしょうか?
また,バグになる可能性のない安全なコードなのでしょうか?
fopenの返り値について
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 なら()内が真になる
という形に出来るようです