scanf関数をつかって変数aに数値7を格納してみます ただしこのプログラムでは5つのaの変数宣言が行われています 一体どの変数aに数値7は格納されるのでしょうか?  解答で~す

solarplexuss「ソーラーとアレサをよんでみるかな


それでは!


猫大好き🌰クリスピ~~~」


ソーラー「はいはい」


アレサ「はいですの(^_^)/」


solarplexuss「ねえ、以下のプログラムで


scanf関数を使って変数aに数値7を格納してるんだけど


なぜ このような


コンパイル結果になるか


一緒にみていかない?


みてかない?


scanf ("%d",&a);


をつかって数値7を取り込んだ場合


どの変数宣言 int a;


によって作製された変数aに


数値7は格納されると思う?」


#pragma warning(disable: 4996)


#include <stdio.h>


int a=100;


void f(int a){

printf("%dをとりこみました。\n",a);

}


int main(void){


printf("入力した数値は%dです。\n",a);


int a=1000;

int b;

int c;


printf("何か数値を入力してください。\n");

scanf ("%d",&a);

f(a);

printf("入力した数値は%dです。\n",a);

for(b=0;b<2;b++){int a=10000;

for(c=0;c<2;c++){int a=100000;

printf("入力した数値は%dです。\n",a);

}

printf("入力した数値は%dです。\n",a);

}

printf("入力した数値は%dです。\n",a);

return 0;

}


コンパイル結果

入力した数値は100です

何か数値を入力してください。

7(と入力すると)

7を取りこみました

入力した数値は7です

入力した数値は100000です

入力した数値は100000です

入力した数値は10000です

入力した数値は100000です

入力した数値は100000です

入力した数値は10000です

入力した数値は7です


ソーラー「aの変数宣言が5回もおこなわれているんだね。


☆  ☆  ☆  ☆  ☆  ☆  ☆  ☆


int a = 100;

void f(int a){自作関数の引数内で変数宣言int aがおこなわれています}

int a = 1000;

int a = 10000;

int a = 100000;

 

この5つですね。

              solarplexussより

☆  ☆  ☆  ☆  ☆  ☆  ☆  ☆



まず ポイントは


scanf関数を使って数値を格納するには

scanf関数が使われる以前に

すなわち

scanf ("%d",&a);

実行される以前に


数値を格納するための変数aが


int a;と


変数宣言されている必要があるよね。


scanf関数が使われる以前に


行われているaの変数宣言は


1つ目は


main関数の外で定義されている


🍎int a=100;


だね。


2つ目は


自作関数の定義


void f(int a){

printf("%dをとりこみました。\n",a);

}

f(int a)の()内の


🍋int a;


そして


main関数内で定義されている


🍊int a=1000;


の合計3つだね。」


solarplexuss

「なるほど~


この3つの変数aのどれかに


もしくは


全部に


scanf関数をつかって取り込まれた数値7が


格納されるわけか・・


さあ

scanf関数によって数値7は


🍎int a=100;

🍋int a; 自作関数fの()内で変数宣言されています

🍊int a=1000;


で変数宣言されたどの変数aに


格納されるのでしょうか?


どうなってるんだろうか😊」


アレサ「ソースコードを上から順番にみていきましょう。


ではまず(^_^)/


このソースコードの


main関数内で1番最初に記述されている命令文


printf("%dをとりこみました。\n",a);


のaには


グローバル変数として定義された

int a=100;

の100が代入されています。


ですので

コンパイル結果は

100をとりこみました。


となります。


そして


いよいよ その次の命令文


scanf ("%d",&a);


ですね。


ここで数値7を変数aに格納するのですが


scanf関数を使って数値7は


int a=100;


変数宣言、初期化されたグローバル変数aには


代入されず


main関数内で定義された


int a=1000;


に数値7が格納されています」


solarplexuss「なぜぇ?」


アレサ


「なぜなら


scanf ("%d",&a);


の変数aは👉👉👈👈で示される


int a=1000;


の変数宣言がおこなわれた


main関数のブロック内で使用されているからです。


int main(void){


printf("入力した数値は%dです。\n",a);


int a=1000;👉👉

int b;

int c;


printf("何か数値を入力してください。\n");

scanf ("%d",&a);👈ここにscanf関数の命令文が記述されています

f(a);

printf("入力した数値は%dです。\n",a);

for(b=0;b<2;b++){int a=10000;

for(c=0;c<2;c++){int a=100000;

printf("入力した数値は%dです。\n",a);

}

printf("入力した数値は%dです。\n",a);

}

printf("入力した数値は%dです。\n",a);

return 0;

👈👈}



つまり


scanf ("%d",&a);

の中の変数aは


同じmain関数のブロック{}内で変数宣言された


int a=1000;


によって作成された変数a


をあらわしているのです。


グローバル変数宣言

int a=100;


よりも


ブロック{}内の

ローカル変数宣言

int a=1000;


の方が


main関数のブロック{}内では優先されるというわけですの




int a=100;によって変数宣言されたグローバル変数aにでなく


int a=1000;によって変数宣言されたグローバル変数aに


scanf関数を使って数値7が格納されることになります。」



solarplexuss「おおぅ そういうことだったのかい!」


アレサ「さあ


scanf関数を使って数値7は


main関数のブロック内で変数宣言された


int a=1000;


の変数aに格納されることとなり


int a=7;という状態となったわけです。


今度は


scanf ("%d",&a);


の次に記述されている命令文


f(a);


に注目してみますね。


このとき


void f(int a){

printf("%dをとりこみました。\n",a);

}

の自作関数 f(int a)の()内の


int aには


たったいま数値7を格納した


main関数内で変数宣言されたローカル変数aが


自作関数の引数として


f(a);


と代入されています


つまり


自作関数のローカル変数aに


main関数のローカル変数aが代入されているんですの。



ですので


f(a);のコンパイル結果は


入力した数値は7です


となります。」


ソーラー「アレサ~ その調子~😊」


アレサ「😊


それでは


その次の命令文


for(b=0;b<2;b++){

int a=10000;

for(c=0;c<2;c++){

int a=100000;

printf("入力した数値は%dです。\n",a);

}

printf("入力した数値は%dです。\n",a);

}

のコンパイル結果がどうなるかみていきます。


この命令文においてはまず


for(c=0;c<2;c++){

int a=100000;

printf("入力した数値は%dです。\n",a);

}が実行されます。


すると このfor(c=0;c<2;c++)の命令文により


2つの繰り返しの命令文である

printf("入力した数値は100000です。);

printf("入力した数値は100000です。);

が形成されます。」


solarplexuss「そうなってるのか~」


アレサ「ここで より


理解しやすくするために


for(b=0;b<2;b++){

int a=10000;

for(c=0;c<2;c++){

int a=100000;

printf("入力した数値は%dです。\n",a);

}

printf("入力した数値は%dです。\n",a);

}


for(c=0;c<2;c++){

int a=100000;

printf("入力した数値は%dです。\n",a);

}

の部分を

形成された

printf("入力した数値は100000です。);

printf("入力した数値は100000です。);

に置き換えてみると


for(b=0;b<2;b++){

int a=10000;

for(c=0;c<2;c++){

int a=100000;

printf("入力した数値は%dです。\n",a);

}

printf("入力した数値は%dです。\n",a);

}



for(b=0;b<2;b++){

int a=10000;

printf("入力した数値は100000です。);

printf("入力した数値は100000です。);

printf("入力した数値は%dです。\n",a);

}


のようにかきかえることができます。


for(b=0;b<2;b++){

int a=10000;

printf("入力した数値は100000です。);

printf("入力した数値は100000です。);

printf("入力した数値は%dです。\n",a);

}

が実行されると

コンパイル結果は

入力した数値は100000です。

入力した数値は100000です。

入力した数値は10000です。

入力した数値は100000です。

入力した数値は100000です。

入力した数値は10000です。


が表示されることになります


そして最後に以下のプログラムをご覧くださいね。


main関数のブロック内の最後に記述された


ソースコード内で👈で示される命令文


printf("入力した数値は%dです。\n",a);👈


に注目してみます」




#include <stdio.h>


int a=100;


void f(int a){

printf("%dをとりこみました。\n",a);

}


int main(void){


printf("入力した数値は%dです。\n",a);


int a=1000;

int b;

int c;


printf("何か数値を入力してください。\n");

scanf ("%d",&a);

f(a);

printf("入力した数値は%dです。\n",a);

for(b=0;b<2;b++){int a=10000;

for(c=0;c<2;c++){int a=100000;

printf("入力した数値は%dです。\n",a);

}

printf("入力した数値は%dです。\n",a);

}

printf("入力した数値は%dです。\n",a);👈

return 0;

}


アレサ「


👈のprintf("入力した数値は%dです。\n",a);ですね


このprintf("入力した数値は%dです。\n",a);内の


変数aは


👉👉から👈👈で示されるように


main関数のブロック{}内で定義された


int a=1000;のスコープ内にあります



int main(void){


printf("入力した数値は%dです。\n",a);


int a=1000;👉👉

int b;

int c;


printf("何か数値を入力してください。\n");

scanf ("%d",&a);

f(a);

printf("入力した数値は%dです。\n",a);

for(b=0;b<2;b++){int a=10000;

for(c=0;c<2;c++){int a=100000;

printf("入力した数値は%dです。\n",a);

}

printf("入力した数値は%dです。\n",a);

}

printf("入力した数値は%dです。\n",a);👈

return 0;

👈👈}


このとき


int a=1000;


の変数aには


すでに


scanf関数により


数値7が格納されているので

printf("入力した数値は%dです。\n",a);👈


のコンパイル結果は

入力した数値は7です。


となるわけです。


以上より

全体としての

コンパイル結果は


コンパイル結果


入力した数値は100です

何か数値を入力してください。

7(と入力すると)

7を取りこみました

入力した数値は7です

入力した数値は100000です

入力した数値は100000です

入力した数値は10000です

入力した数値は100000です

入力した数値は100000です

入力した数値は10000です

入力した数値は7です


となるんですの」


ソーラー solarplexuss


「やったね アレサ😊😊(´▽`*)」





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

作者を応援しよう!

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

応援したユーザー

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