fopenの返り値について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
もずく

fopenの返り値について

#1

投稿記事 by もずく » 16年前

ファイルを読み込む時は,まず

FILE *fp = fopen("hoge","r");

とすると思います.
その後のエラー処理について,

if(fp==NULL)
 …

と習ったのですが,

if(!fp)
 …

としているソースを見かけました.
実行してみると確かに動きましたが,
これは何を評価しているのでしょうか?
また,バグになる可能性のない安全なコードなのでしょうか?

kazuoni

Re:fopenの返り値について

#2

投稿記事 by kazuoni » 16年前

http://www005.upp.so-net.ne.jp/h-masuda ... k0204.html

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

Dixq (管理人)

Re:fopenの返り値について

#3

投稿記事 by Dixq (管理人) » 16年前

C言語においてどのように定義されているかは他の方に任せます。

大抵のコンパイラでは

#define NULL ((void*)0)

と定義されているようです。汎用ポインタ型の0ですね。

また、他トピの回答内容と同じになりますが、

判定式は真か偽かで判定されますよね。

if(真){
    //
}

はいつも実行されますが

if(偽){
    //
}

はいつも実行されませんね。では「!(=否定)」をつけるとどうなるか

if(!真){
    //
}

はいつも実行されません。

if(!偽){
    //
}

はいつも実行されます。そして真とは0以外、偽とは0であることから、

if(!0){
    //
}

はいつも実行されます。そこで

if(!fp){
    //
}

の成す意味は、「fpが0なら実行し、0以外なら実行しない」と言う意味になります。

木霊

Re:fopenの返り値について

#4

投稿記事 by 木霊 » 16年前

 自分の持っている辞典では NULL の定義例として、

#define NULL (void *)0

とあります。 また、以前は「0」に定義されている事もあったようです。
 ですから、

if(fp==NULL){オープン失敗} は
if ( fp == 0 ) { オープン失敗 } になり、さらに「!」が否定演算子なので

if ( !fp ) { オープン失敗 }// fp が NULL なら()内が真になる
という形に出来るようです

御津凪

Re:fopenの返り値について

#5

投稿記事 by 御津凪 » 16年前

関係ないですが、参考までに。
if(!(fp != NULL))
上記の条件式でも !fp や fp == NULL と同じです。

もずく

Re:fopenの返り値について

#6

投稿記事 by もずく » 16年前

なるほど,

#define NULL (void *)0

とNULLが定義されているから成せる技なのですね.
どうもありがとうございました.

閉鎖

“C言語何でも質問掲示板” へ戻る