ページ 11

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
http://www005.upp.so-net.ne.jp/h-masuda ... k0204.html

ググればすぐ分かりますが、!は否定の論理演算子です。

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が定義されているから成せる技なのですね.
どうもありがとうございました.