if(fp=NULL)の代わりにif(fp!=NULL)と記述してみましょう。fp=NULLの=は代入演算子ですがfp!=NULLの!=は関係演算子です。ですので!=は=の否定形ではありません

🌳🌳🌳

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


確認するプログラムは


次のようなものでした。


次のプログラムでは


オープンモード"r"で


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


開こうとしています。



#pragma warning(disable: 4996)

#include <stdio.h>

int main (void){


FILE *fp;

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


if(fp==NULL){

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

return -1;}

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


fclose(fp);

return 0;

}


コンパイル結果

EAZY IDECの場合

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


Visual Studioの場合

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



ここで

if(fp==NULL)の部分を

if(fp=NULL)としてはいけなかったのですね


ところで


このプログラムは

次のプログラムのように


if(fp==NULL){

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

return -1;}

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

の部分を


if(fp!=NULL)を使って


if(fp!=NULL){

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

}

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

return -1;}


とかきかえることができます


#pragma warning(disable: 4996)

#include <stdio.h>

int main (void){


FILE *fp;

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


if(fp!=NULL){

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

}

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

return -1;}

fclose(fp);

return 0;

}


コンパイル結果

EAZY IDECの場合

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


Visual Studioの場合

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



このプログラムの中の命令文


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


FILE *fp;

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

実行された際


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


fopen関数は


戻り値NULLを返され


ファイルを開くのに成功すれば


fopen関数は


戻り値NULL以外の値を返されるよう設定されています。


ですので


ファイルオープンに成功すると


fpはNULL以外の値をもつようになり


プログラム内のif文


if(fp!=NULL){

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

}

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

return -1;}


if()内の条件式(論理式)でfp!=NULLが成立するので


if(fp!=NULL)につづく命令文

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


が実行され


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


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


が表示されます。


このとき


if(fp!=NULL)の!=は


関係演算子とよばれています


論理式

fp!=NULLの


左辺と右辺が等しい値をもたないときは


論理式fp!=NULLは


(fp!=NULL)=1


のように


真の値1をもつようになり


論理式

fp!=NULLの


左辺と右辺が等しい値をもつときは


論理式fp!=NULLは


(fp!=NULL)=0


のように


偽の値0をもつようになります


もう1つ例をご紹介いたしますと


論理式

a!=1


は変数aが1の値を格納しているとき


左辺と右辺が等しい値をもつので


論理式

a!=1


(a!=1)=0


のように


偽の値0をもつようになります


論理式

a!=1


は変数aが1の値を格納していないとき


左辺と右辺が等しい値をもたないので


論理式

a!=1


(a!=1)=1


のように


真の値0をもつようになります


ここで


if(fp==NULL)の

==は関係演算子と呼ばれ

a==1のような

論理式を形成します


論理式a==1は


変数aが1の値をもつとき

真となり

(a==1)=1

のように

1の値を持ち


変数aが1以外の値をもつとき


偽となり

(a==1)=0

のように

0の値を持ちます



ちょうど

論理式

a==1

論理式

a!=1



aの格納している値に対して


反対の値をもつのがわかります。


a!=1の


!=

は関係演算子であるのに対し


a=1の=は代入演算子と呼ばれ


変数aに1を代入し


変数aの格納している値を1にする働きがあります。


a=1も


一応論理式として


変数aが1の値をもつとき


真となり

論理式(a=1)は1の値を持ち


変数aが1以外の値をもつとき


偽となり

論理式(a=1)は0の値を持つのですが


a=1を論理式として使うと


プログラムを実行できない場合があります


ですから


fp!=NULLをもちいずに


if文を構成したいなら


代入演算子をもちいた


fp=NULLでなく


同じ関係演算子である==をつかって


fp==NULLを


もちいたほうがよいというわけです。

🌳🌳🌳


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

作者を応援しよう!

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

応援したユーザー

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