🌞自作関数2 変数xを引数にもつ自作関数void fanction(int x)について考察してみる int xをxと記述してもよいのでしょうか? 

それでは


自作関数の定義内に


printf("%d\n",x);


のように


変数xが使われている関数がある場合


どのように自作関数の定義を記述すればよいでしょうか?


次のプログラムをみていきましょう。


#include <stdio.h>


void function(int x){

printf("%d\n",x);

return;

}


int main(void){

function(1);

return 0;

}


コンパイル結果

1


ここで


void function(int x){

 printf("%d\n",x);

return;

}


で定義された自作関数function(int x)は


intxに代入された整数値を


printf("%d\n",x);


を通して


コマンドプロンプト画面にprintf出力表示する自作関数です。


それでは 


このプログラムにおいて


自作関数

void function(int x){

 printf("%d\n",x);

return;


のintxに代入される数値は


どこから受けとっているのでしょうか 


それは


main関数(mainも実は関数です)内で


function(1);


と記述されたときの1を


intxは受け取っています。


intx=1;


となっているわけですね。


そのようなわけで

function(1);

が実行されると

printf("%d\n",x);


の変数xに1が代入されることになり


コンパイル結果は


1

となります。



それでは


function(  )の(  )の中身を



int xでなくxとした



次のプログラムをコンパイルしてみましょう。


#include <stdio.h>


void function(x){

printf("%d\n",x);

return;

}


int main(void){

function(1);

return 0;

}


実は この状態は正しくありません。


なぜなら


変数宣言int x;がおこなわれていないのに


変数xを使おうとしているのと同じだからです。


とりあえずコンパイルしてみると



#include <stdio.h>


void function(x){

printf("%d\n",x);

return;

}


int main(void){

function(1);

return 0;

}


コンパイル結果


EAZY IDECの場合

1


となります。


Visual Studioの場合はビルドすると


エラー C2182 'function': 'void' 型が不適切に使用されています。

エラー C2448 'function': 関数の定義が間違っています。

エラー C2065 'x': 定義されていない識別子です。

エラー C2064 1 引数を取り込む関数には評価されません。

エラー (アクティブ) E0020 識別子 "x" が定義されていません


表示され


プログラムの実行はできません。


エラー C2065 'x': 定義されていない識別子です。


を表示するところからも


Visual Studioはxが変数宣言されていないと気付いています。




普通はxの変数宣言のないプログラムで


xを用いると


次のプログラムのように


#include <stdio.h>


int main(void){

printf("%d\n",x);

return 0;

}


コンパイル結果


(EAZY IDECの場合)


ファイル「C:/Users/solarplexuss/AppData/Local/EasyIDEC/project/ wwww/main.c」の

「5行目」で記述エラーを発見しました。

「x」が定義されていません。

名前が間違っていないかどうか確認してください。


ビルド結果(Visual Studioの場合)


エラー (アクティブ) E0020 識別子 "x" が定義されていません

エラー C2065 'x': 定義されていない識別子です。


とコンパイルエラー(ビルドエラー)が出るのですが


なぜか EAZY IDECの場合は


うまくコンパイルできています


このように

void function(int x){

printf("%d\n",x);

return;

}


と 自作関数 function( )の中身をint xにせず


xとして


次のように

void function(x){

printf("%d\n",x);

return;

}

自作関数を定義してもプログラムは実行できているので


自作関数 function( )の中身は


int xでなくxでもよいようにおもわれます。




が・・・・・・・・





ここで さらに もうちょっと遊んでみましょう。


function(  )の(  )の中身を


int xでなくfloatxとした次のプログラムは


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


ルンルン😝気分でコンパイルしてみましょう。


#include <stdio.h>


void fanction(float x){

printf("%d\n",x);

return;

}


int main(void){

fanction(1);

return 0;

}


ここではコンパイル結果は


(EAZY IDECの場合)

(Visual Studioの場合)


0


となります。


まず


fanction(1)の1は


float xに格納されるわけですが


ここで整数値1は型変換により実数としてfloatに格納されるため



今の自作関数の定義の


void fanction(float x){

printf("%d\n",x);

return;

}


の

printf("%d\n",x);


を


実数値をprintf出力表示するときに用いられる


%f出力変換指定子をもちいて


printf("%f\n",x);


と書き換えて


実行するとコンパイル結果は1.000000になります。


このプログラムの場合は


実数値をprintf出力表示するのに


整数値をprintf出力表示するときに用いられる


%d出力変換指定子をもちいて


printf("%d\n",x);


が行われているので


コンパイル結果

0


となります。


🍓🍓🍓

天国にいけるC言語入門でも学習されましたように


実数値を整数値に対応する%d出力変換指定子を用いてprintf出力表示すると、


いろいろな数値に変換されて出力表示されるのでしたね。


(この場合は1.000000から0と出力表示されています)

🍓🍓🍓



ここで人情として


自作関数の定義で function( )の( )の中身である


自作関数の引数が


次のようにxでint x でない場合


void fanction(x){

printf("%d\n",x);

return;

}


自作関数の引数であるxに


実数5.55を


代入するとどのような値が


printf("%d\n",x);


により

出力表示されるか


実行してみたくなりますね。


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


(お試し、その1)

#include <stdio.h>


void fanction(x){

printf("%d\n",x);

return;

}


int main(void){

fanction(5.55);

return 0;

}


コンパイル結果は


858993459となります。


実数である5.55を%d出力変換指定子をつかってprintf出力表示したせいか


5.55とまったくちがう数値858993459が出力されています。


Visual Studioの場合


エラー (アクティブ) E0020 識別子 "x" が定義されていません

エラー (アクティブ) E0020 識別子 "x" が定義されていません

エラー C2064 1 引数を取り込む関数には評価されません。

エラー C2065 'x': 定義されていない識別子です。

エラー C2448 'fanction': 関数の定義が間違っています。

エラー C2182 'fanction': 'void' 型が不適切に使用されています。


とビルドエラーが表示されます。


やはりVisual Studioはxが変数宣言されていないのが気になっていますね


そこで このプログラムの自作関数の定義内の


printf("%d\n",x);の部分の


%d出力変換指定子を%f出力変換指定子に変換して


プログラムをコンパイルしてみると


(お試し、その2)

#include <stdio.h>


void fanction(x){

printf("%f\n",x);

return;

}


int main(void){

fanction(5.55);

return 0;

}


コンパイル結果は


5.550000


となるはずです


ふつうにかんがえてそうですよね。











ところが


コンパイル結果は


0.000000となります。


Visual Studioの場合


エラー (アクティブ) E0020 識別子 "x" が定義されていません

エラー (アクティブ) E0020 識別子 "x" が定義されていません

エラー C2064 1 引数を取り込む関数には評価されません。

エラー C2065 'x': 定義されていない識別子です。

エラー C2448 'fanction': 関数の定義が間違っています。

エラー C2182 'fanction': 'void' 型が不適切に使用されています。


とビルドエラーが表示されます。


実数値5.55を%f出力変換指定子を用いて


printf出力表示したにもかかわらず


まるで整数を%f出力変換指定子を用いて


printf出力表示したかのように


0.000000がコマンドプロンプト画面に表示されました。


これはいったいどういうことでしょうか?


いったい数値5.55は


整数の型に格納されているのか?


実数の型に格納されているのか?


(お試し、その1)の結果をみると


数値5.55は実数の型に格納されているようにみえ


(お試し、その2)の結果をみると


数値5.55は整数の型に格納されているようにみえて


???????となります。


つまり自作関数の定義において


次のように


void fanction(x){

printf("%f\n",x);

return;

}


void fanction(int x)と記述するところを


void fanction(x)と記述してしまうと


xに入力される数値が


printf("%f\n",x);


をつかって


うまくprintf出力表示されない場合があります。


ですので


printf("%d\n",x);をつかって整数値を表示したいなら


自作関数の定義で


void function(int x){

printf("%d\n",x); */%dにするのをおわすれなく/*

return;

}



      xの変数宣言  int xを



       function()の()の中に記述して




printf("%d\n",x);をつかって実数値を表示したいなら


次のように

自作関数の定義で


void function(float x){

printf("%f\n",x); */%fにするのをおわすれなく/*

return;

}

       


  xの変数宣言  float xを



        function()の()の中に記述します。



と いうことで普通に


実数5.55をfloat xに格納して


%f出力変換指定子を使って


printf出力表示する自作関数のプログラムをコンパイルしてみましょう。


#include <stdio.h>


void function(float x){

printf("%f\n",x);

return;

}


int main(void){

function(5.55);

return 0;

}


コンパイル結果

(EAZY IDECの場合)

(Visual studioの場合)


5.550000


やったね!


うまく

5.55をprintf出力表示できました😊


Visual studioもxがちゃんと変数宣言されているので


ソースコードをコンパイルすることができています。

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

作者を応援しよう!

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

応援したユーザー

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