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