第3講 C言語の基本
第7話 箱が使える範囲(スコープ)について
初心者の皆さんは、
#include<stdio.h> //秘密の道具箱から、printf()という社員(関数)を借りるために必要
void f(); //1から10までの足し算をしてその結果をコンソール画面に表示させる社員
int main(){
  int a; //整数を入れる箱aを用意
  f(); //社員f()に足し算をして結果を表示する仕事を命じている。
  return(0); //プログラムを閉めるためのお呪い
}
void f(){
  a=1; //整数を入れる箱aに1を入れる。
  a=a+2;
  a=a+3;
  a=a+4;
  a=a+5;
  a=a+6;
  a=a+7;
  a=a+8;
  a=a+9;
  a=a+10;
  printf("1+2+3+4+5+6+7+8+9+10=%d\n",a); //箱aの中身を表示
}
としてしまったのではないでしょうか。
ところが、エラーしてしまいましたね。
そして、エラー原因に、
1>d:\vcpp2010\b\b\a.cpp(4): warning C4101: 'a' : ローカル変数は 1 度も使われていません。
1>d:\vcpp2010\b\b\a.cpp(8): error C2065: 'a' : 定義されていない識別子です。

等が出てきていますね。
そもそもデバッグをする前に、
001
エディタが問題を指摘しています。
赤い波線が、このコードには問題がありますよと教えてくれているのです。
エディタを採用する理由は、自動段組だけでなく、
コードの問題も指摘して教えてくれることにもあるのです。

1>d:\vcpp2010\b\b\a.cpp(8): error C2065: 'a' : 定義されていない識別子です。
8は、コードの8行目を意味します。
ですから、8行目に問題がありますよと、
デバッガが教えてくれています。
前に書き忘れてしまいましたが、
整数型変数aの宣言
  int a; //整数を入れる箱aを用意
は、『整数型変数aを定義している』ともいいます。
定義という言葉は、もちろん中学生の2年生以下の人は知りませんね。
中学2年生で図形の証明という単元で、始めて学ぶからです。
定義とは、言葉の意味を約束することです。
  int a; //整数を入れる箱aを用意
は、整数を入れる箱を用意してその箱の名前をaと約束するという意味です。
aという言葉の意味を約束したのです。
それならば、
1>d:\vcpp2010\b\b\a.cpp(8): error C2065: 'a' : 定義されていない識別子です。
はますます意味不明です。
だって、2行目で
  int a; //整数を入れる箱aを用意
aという言葉の意味を約束しているのですから。
この疑問を解消する鍵は、
第7話のテーマ名箱が使える範囲(スコープ)についてにあります。
実は、C言語の場合用意される箱(変数)は、
その箱を用意した人しか使えないのです。
箱を用意した人は社長のmain()です。
したがって、aという整数を入れる箱は社長しか使うことができないのです。
前に、main()は絶対的な親分であると書きましたが、
実はその絶対的な親分であっても、
社員が用意した箱を使うことはできないのです。
つまり、C言語が用意する箱(変数)は、その社員専用の箱なのです。
箱の使用できる範囲をスコープといいます。
スコープという言葉を使えば、aのスコープは、
002
003
赤い枠内に限定されているのです。
このようにスコープが関数内に限定されている変数をローカル変数というのです。
地方のことをローカルといいますね。
使える範囲がその地方に限定されている変数という意味です。
この場合には、その社員専用に限定されているということですが。
1>d:\vcpp2010\b\b\a.cpp(4): warning C4101: 'a' : ローカル変数は 1 度も使われていません。
の意味が始めて理解できますね。
003
ではせっかく箱aを用意したのに、
1回も使われていません。
そして、
1>d:\vcpp2010\b\b\a.cpp(8): error C2065: 'a' : 定義されていない識別子です。
も当然であることがわかります。
箱aはあくまで社長main()の箱であって、
社員f()の箱ではありません。
もし、社員f()が箱aを使いたいのであれば、
自分で用意しなければなりません。
実際にコードを
#include<stdio.h> //秘密の道具箱から、printf()という社員(関数)を借りるために必要
void f(); //1から10までの足し算をしてその結果をコンソール画面に表示させる社員
int main(){
  int a; //整数を入れる箱aを用意
  f(); //社員f()に足し算をして結果を表示する仕事を命じている。
  return(0); //プログラムを閉めるためのお呪い
}
void f(){
  int a; //整数を入れる箱aを用意
  a=1; //整数を入れる箱aに1を入れる。
  a=a+2;
  a=a+3;
  a=a+4;
  a=a+5;
  a=a+6;
  a=a+7;
  a=a+8;
  a=a+9;
  a=a+10;
  printf("1+2+3+4+5+6+7+8+9+10=%d\n",a); //箱aの中身を表示
}
コピペ用添付ファイル
と変更してみましょう。
すると、今回はビルドに成功します。
ただし、
1>d:\vcpp2010\b\b\a.cpp(4): warning C4101: 'a' : ローカル変数は 1 度も使われていません。
の指摘は相変わらずです。
これはどういうことでしょうか。


第6話へ   第8話へ
 
002

初心者のための excel 2016 マクロ VBA 入門講義 基礎から応用まで
vc++ c言語 c++ 入門 初心者 基礎から応用まで
eclipse c++ 入門
魔方陣 数独で学ぶ VBA 入門

数独のシンプルな解き方・簡単な解法の研究
VB講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座
初心者のための世界で一番わかりやすいVBA入門講義(基礎から応用まで)
初心者のための VC++による C言語 C++ 入門 基礎から応用まで第1部
eclipse java 入門
java 入門 サイト 基礎から応用まで
本サイトトップへ