if(fp==NULL)の代わりにif(fp=NULL)と記述することはできません。==は関係演算子で=は代入演算子となっています。

🌞  🌞  🌞

ファイルがきちんと開かれているかどうかを


確認するプログラムは


次のようなものでした。



#pragma warning(disable: 4996)

#include <stdio.h>

int main (void){


FILE *fp;

fp=fopen("TEN-GOGO-C-language.txt","w");


if(fp==NULL){

printf("ファイルオープンに失敗しましたよ~ん\n");

return -1;}

else printf("Hello!ファイルオープンに成功しましたよ~ん\n");


fclose(fp);

return 0;

}


コンパイル結果


EAZY IDECの場合

Hello!ファイルオープンに成功しましたよ~ん


Visual Studioの場合

Hello!ファイルオープンに成功しましたよ~ん



このプログラムでは新規に


TEN-GOGO-C-language.txtファイルが作製され


そのファイルをオープンできる。


(ファイルにアクセスして読み書きできる状態になっている)


ことが確認されています



ハードディスク内のTEN-GOGO-C-language.txtファイルに


保存されているデータを読み取れるよう


今度は


ファイルポインタ変数宣言とfopen関数の設定

FILE *fp;

fp=fopen("TEN-GOGO-C-language.txt","r");


をオープンモード"r"でおこない


TEN-GOGO-C-language.txtファイルを開くとします。


このとき


ハードディスク内に


TEN-GOGO-C-language.txtファイルが存在していなかったとします。


(ハードディスク内のTEN-GOGO-C-language.txtファイルは


コンピュータの管理画面からファイルホルダのアイコンを

右クリックして


表示されるメニューから


削除を選択、クリックすると


手動で削除することができます。)


ハードディスク内に


TEN-GOGO-C-language.txtファイルが存在していない場合


もちろん


TEN-GOGO-C-language.txtファイルを開くことはできません。


TEN-GOGO-C-language.txtファイルを開くのに失敗すると


ファイルポインタ変数宣言とfopen関数の設定

FILE *fp;

fp=fopen("TEN-GOGO-C-language.txt","r");


が実行される際


fopen関数はNULLという戻り値をかえされるよう設計されており


fopen関数は


fopen("TEN-GOGO-C-language.txt","w")=NULL


であらわされるように


NULL


という値をもつことになります。


fp=fopen("TEN-GOGO-C-language.txt","w")


より


fp=fopen("TEN-GOGO-C-language.txt","w")=NULL


となり


fp=NULLより


ファイルポインタ変数fpの格納する値は


NULLとなります。


このNULLは数字の0と等しい働きをしており


ファイルポインタ変数fpは


fp=0


の値を持つことになります


先程のプログラム内の


if文の命令文


if(fp==NULL){

printf("ファイルオープンに失敗しましたよ~ん\n");

return -1;}

else printf("Hello!ファイルオープンに成功しましたよ~ん\n");


if(fp==NULL)の条件式


条件式fp==NULLは論理式であるので


fpに代入される値により


(fp==NULL)=0


もしくは


(fp==NULL)=1


の値をもつことになります。


今、fpの格納している値はNULLなので


if(fp==NULL)の中の


条件式fp==NULLは


(fp==NULL)=1


真の値1をもつことになります。


fp=NULL


つまり


fp=0


という値をもっていても


fp==NULLは条件式なので


(fp==NULL)=1

真の値1をもつことになるのがポイントですね。


つまりif文の命令文


if(fp==NULL){

printf("ファイルオープンに失敗しましたよ~ん\n");

return -1;}

else printf("Hello!ファイルオープンに成功しましたよ~ん\n");


if(1){

printf("ファイルオープンに失敗しましたよ~ん\n");

return -1;}

else printf("Hello!ファイルオープンに成功しましたよ~ん\n");


となり


if()の()内の値が1ならば

if()の直ぐあとに続く命令文を実行し


if()の()内の値が0ならば

elseの直ぐあとに続く命令文を実行するという


if()文のルールにより


if()の()内の値が1なので

if(1)の直ぐあとに続く命令文


printf("ファイルオープンに失敗しましたよ~ん\n");

return -1;}


が実行され


コマンドプロンプト画面に


ファイルオープンに失敗しましたよ~ん


が表示されます。


ではでは


面白くなるのはここからですよ~



次のプログラムのように


if文の


if(fp==NULL)の部分が


if(fp=NULL)と条件式が


書き換えられて


#pragma warning(disable: 4996)

#include <stdio.h>

int main (void){


FILE *fp;

fp=fopen("TEN-GOGO-C-language.txt","w");


if(fp=NULL){

printf("ファイルオープンに失敗しましたよ~ん\n");

return -1;}

else printf("Hello!ファイルオープンに成功しましたよ~ん\n");


fclose(fp);

return 0;

}


上記のようなプログラムが実行されたなら


どのようなコンパイル結果となるのでしょうか?


fp==NULLの==は左辺と右辺を比較する関係演算子なので


論理式

(fp==NULL)は


fpのとる値により


(fp==NULL)=0

または

(fp==NULL)=1

のように


0か1の値をもつこととなります。


それに対し


if(fp=NULL)



fp=NULLの=は左辺に右辺の値を代入する代入演算子です。


ですので


fp=NULL

fpにNULLを代入することになるので


fpはつねにNULLという値をもつことになります。


NULLは0に等しい値をもつので


fpは常に0という値をもつことになります。


ですので


このままでは


if(fp=NULL)は


常に


if(0)


になり


if文


if(fp=NULL){

printf("ファイルオープンに失敗しましたよ~ん\n");

return -1;}

else printf("Hello!ファイルオープンに成功しましたよ~ん\n");



if(0){

printf("ファイルオープンに失敗しましたよ~ん\n");

return -1;}

else printf("Hello!ファイルオープンに成功しましたよ~ん\n");


に等しくなり


if()の()内の値が1ならば

if()の直ぐあとに続く命令文を実行し


if()の()内の値が0ならば

elseの直ぐあとに続く命令文を実行するという


if()文のルールにより


if()の()内の値が0なので


elseの直ぐあとに続く命令文


printf("Hello!ファイルオープンに成功しましたよ~ん\n");


が実行されることに


なってしまいそうですね・・・


if(fp=NULL)と記述するのは正しくない記述法なのです。



それでは本当に


if(fp==NULL)の部分が


if(fp=NULL)と表記されているプログラム


#pragma warning(disable: 4996)

#include <stdio.h>

int main (void){


FILE *fp;

fp=fopen("TEN-GOGO-C-language.txt","w");


if(fp=NULL){

printf("ファイルオープンに失敗しましたよ~ん\n");

return -1;}

else printf("Hello!ファイルオープンに成功しましたよ~ん\n");


fclose(fp);

return 0;

}


上記のプログラムが実行されたなら


コンパイル結果はどのようになるでしょうか?


if(fp=NULL)はどのように機能するのでしょうか?


ハードディスク内にTEN-GOGO-C-language.txtファイルが存在せず


ファイルオープンに失敗したなら


fopen("TEN-GOGO-C-language.txt","w")は戻り値NULL


をもつことになり


fp=NULLとなるのですが


そもそも


if文の命令文


if(fp=NULL){

printf("ファイルオープンに失敗しましたよ~ん\n");

return -1;}

else printf("Hello!ファイルオープンに成功しましたよ~ん\n");



if(fp=NULL)の条件式で


fpにNULLが代入されているので


NULLは0に等しいことにより


if(fp=NULL)は


if(0)となり


fopen("TEN-GOGO-C-language.txt","w")に戻される


戻り値の値に関わらず


elseのすぐ後につづく命令文


printf("Hello!ファイルオープンに成功しましたよ~ん\n");


が実行されそうですね。


実際のところ


🌞1

printf("ファイルオープンに失敗しましたよ~ん\n");

return -1;}


🌞2

printf("Hello!ファイルオープンに成功しましたよ~ん\n");



🌞1と🌞2の


どちらの命令文が実行されるでしょうか?


実は

fp=NULLは


if文の()内で


if(fp=NULL)のように


用いられると


fp==NULLと同じく条件式の働きをするようになります。



ファイルオープンに失敗すると


fopen関数はNULLという戻り値をもち


fopen("TEN-GOGO-C-language.txt","w")=NULL


fp=fopen("TEN-GOGO-C-language.txt","w")=NULL


となり


fp=NULLとなります。


このNULLは数字の0と等しい働きをしており


ファイルポインタ変数fpは


fp=0


の値を持つことに


そのことにかかわらず


もとから


if(fp=NULL)内の


fp=NULL


NULLが0に等しいことにより


(fp=NULL)=0の値をもつようにみえますが


このプログラムのif文


if(fp=NULL){

printf("ファイルオープンに失敗しましたよ~ん\n");

return -1;}

else printf("Hello!ファイルオープンに成功しましたよ~ん\n");


において


if(fp=NULL)内の


fp=NULLは


条件式


fp==NULL

と同じ働きをするので


fpがNULLという値を返されることになったなら


(fp==NULL)と記述されていたなら


(fp==NULL)=1という値を持つように


if(fp=NULL)の


(fp=NULL)は0でなく


(fp=NULL)=1

という

1の値を持つことになります


ですので


if(fp=NULL)と記述された場合


fp=NULL


つまり


fp=0と


fpに0が代入されているわけではないのですね


そのようなわけで


ファイルオープンに失敗すると


if文の条件式fp=NULLは1の値を持つので


if(fp=NULL){

printf("ファイルオープンに失敗しましたよ~ん\n");

return -1;}

else printf("Hello!ファイルオープンに成功しましたよ~ん\n");


if(0){

printf("ファイルオープンに失敗しましたよ~ん\n");

return -1;}

else printf("Hello!ファイルオープンに成功しましたよ~ん\n");


でなく


if(1){

printf("ファイルオープンに失敗しましたよ~ん\n");

return -1;}

else printf("Hello!ファイルオープンに成功しましたよ~ん\n");


となり


if()文のルール通り


if()の()内の値が1と真の値をもつので


if()の直ぐあとにつづく命令文


printf("ファイルオープンに失敗しましたよ~ん\n");

return -1;}


が実行され


コマンドプロンプト画面に


EAZY IDECの場合


ファイルオープンに失敗しましたよ~ん


が表示されます。



Visual Studioの場合


プログラムを実行しようとすると


警告文が出て


続行するかどうかを尋ねられる画面が出てくるので


いったんプログラムの実行がとまってしまいます。



ゲームプログラムで


if(fp=NULL)と記述すると


バグの原因となるかもしれません。




ではお話を改めて



TEN-GOGO-C-language.txtのファイルオープンに成功したなら


次のプログラムが実行されると


#pragma warning(disable: 4996)

#include <stdio.h>

int main (void){


FILE *fp;

fp=fopen("TEN-GOGO-C-language.txt","w");


if(fp==NULL){

printf("ファイルオープンに失敗しましたよ~ん\n");

return -1;}

else printf("Hello!ファイルオープンに成功しましたよ~ん\n");


fclose(fp);

return 0;

}


コマンドプロンプト画面に


どのようなコンパイル結果が表示されるのでしょうか?



TEN-GOGO-C-language.txtファイルを開くのに成功すると


fp=fopen("TEN-GOGO-C-language.txt","w")


はNULL以外の数値を


戻り値にもつよう設定されています。


ですので


fopen("TEN-GOGO-C-language.txt","w")≠NULL


fp=fopen("TEN-GOGO-C-language.txt","w")≠NULL


となり


fp≠NULLとなります。


そうなると


今のプログラムの

if文


if(fp==NULL){

printf("ファイルオープンに失敗しましたよ~ん\n");

return -1;}

else printf("Hello!ファイルオープンに成功しましたよ~ん\n");


のif(fp==NULL)の


条件式の


fp==NULLが成立せず


条件式(fp==NULL)は偽の値0をもつことになります。


ですから


if(fp==NULL){

printf("ファイルオープンに失敗しましたよ~ん\n");

return -1;}

else printf("Hello!ファイルオープンに成功しましたよ~ん\n");


if(0){

printf("ファイルオープンに失敗しましたよ~ん\n");

return -1;}

else printf("Hello!ファイルオープンに成功しましたよ~ん\n");


に等しくなり


if()文のルール通り


if()の()内の値が0という偽の値をもつので


if()の直ぐあとに続く命令文は実行されず


elseの直ぐあとに続く命令文が実行され


コマンドプロンプト画面には


EAZY IDECの場合


Hello!ファイルオープンに成功しましたよ~ん


Visual Studioの場合


Hello!ファイルオープンに成功しましたよ~ん


が表示されます。


では


ファイルオープンに成功したとき


if(fp=NULL){

printf("ファイルオープンに失敗しましたよ~ん\n");

return -1;}

else printf("Hello!ファイルオープンに成功しましたよ~ん\n");


と記述されていたら


実行されるのは


printf("ファイルオープンに失敗しましたよ~ん\n");

の命令文でしょうか


それとも


printf("Hello!ファイルオープンに成功しましたよ~ん\n");


でしょうか?



TEN-GOGO-C-language.txtファイルを開くのに成功すると


fp=fopen("TEN-GOGO-C-language.txt","w")


はNULL以外の数値を


戻り値にもつよう設定されています。


ですので


fopen("TEN-GOGO-C-language.txt","w")≠NULL


fp=fopen("TEN-GOGO-C-language.txt","w")≠NULL


となり


fp≠NULLとなります。


今のプログラムの


if文


if(fp=NULL){

printf("ファイルオープンに失敗しましたよ~ん\n");

return -1;}

else printf("Hello!ファイルオープンに成功しましたよ~ん\n");


のif(fp=NULL)の


fp=NULLは

条件式

fp==NULL

のような働きをするので


fp≠NULL

なら

fp==NULLが成立せず

fp==NULLが偽の値0をもつように


条件式

(fp=NULL)は偽の値0をもつことになります。


ですから


if(fp=NULL){

printf("ファイルオープンに失敗しましたよ~ん\n");

return -1;}

else printf("Hello!ファイルオープンに成功しましたよ~ん\n");


if(0){

printf("ファイルオープンに失敗しましたよ~ん\n");

return -1;}

else printf("Hello!ファイルオープンに成功しましたよ~ん\n");


に等しくなり


if()文のルール通り


if()の()内の値が0なので

if()の直ぐ後につづく命令文は実行されず


else に続く命令文が実行され


コマンドプロンプト画面には


EAZY IDECの場合


Hello!ファイルオープンに成功しましたよ~ん


が表示されます。



Visual Studioの場合


プログラムを実行しようとすると


これまた


警告文が出て


続行するかどうかを尋ねられる画面が出てくるので


いったんプログラムの実行がとまってしまいます。


ゲームプログラム内で

if(fp=NULL)


が使用されると


プログラムの実行が止まってしまい


バグの原因となりそうですね。


このように


if文の条件式には


fp=NULLでなく


fp==NULLを使わなければなりません


🌞🌞🌞


  • Twitterで共有
  • Facebookで共有
  • はてなブックマークでブックマーク

作者を応援しよう!

ハートをクリックで、簡単に応援の気持ちを伝えられます。(ログインが必要です)

応援したユーザー

応援すると応援コメントも書けます