第3講 C言語の基本
第8話 スコープが関数内に限定されていることの意義
#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 度も使われていません。
と指摘されるのは実は当たり前です。
今回は、社長が用意した箱も社員f()が用意した箱もaと名付けましたが、
同じ名前であっても、別の箱です。
社員f()は箱を何度も使っていますが、
社長は、箱aをせっかく用意したのに、
一度も使っていませんね。
f()が自分が用意した箱を使ったのであって、
社長が用意した箱は、使っていないからです。
ですから、
1>d:\vcpp2010\b\b\a.cpp(4): warning C4101: 'a' : ローカル変数は 1 度も使われていません。
と書かれないためには、
#include<stdio.h> //秘密の道具箱から、printf()という社員(関数)を借りるために必要
void f(); //1から10までの足し算をしてその結果をコンソール画面に表示させる社員
int main(){
  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の中身を表示
}
としなければならないのです。

変数のスコープがその関数内に限定されていること、
これがC言語がプログラム言語のキングオブキングになった大きな理由の1つです。
私は、関数のことをよく独立部品ともいいます。
独立とは、他の関数は基本的には変数の中身をいじることができないことを指しています。
ここがビルゲイツが開発したプログラム言語BASICと決定的に、
異なっていました。
独立であること、つまり他の社員が基本的に箱の中身を変えることができないこと、
これがC言語の強みですし、
今はどのプログラム言語もC言語の路線を踏襲(とうしゅう)しています。
ごめんなさい。踏襲というむずかしい言葉を使ってしまいました。
わかりやすくいうと他の言語もC言語の真似をしています。
踏襲の意味は『前の人のやり方などをそのまま受け継ぐ』
http://imimatome.com/kotobanoimi/toushuu.htmlより引用)ことです。
なぜ、独立していること=変数のスコープが関数内に限定されることがよい点なのでしょうか。
それは、他の関数で箱の中身を変更される心配がないので、
その関数(部品)のみの開発に専念できることとプログラムがわかりやすくなるという2つの利点があります。
市販されているゲームのプログラミングは、分業で行われています。
部品AはPさん、部品BはQさん、・・・等に。
もし、関数で用意した変数の中身が他の関数に変えられてしまう心配がある場合には、
他の関数の中身を知らないと、
関数の開発ができないということになってしまいます。
ですが、書き換えられる心配がなければ、その部品のみの開発に専念して、
他の部品の中身を知らなくてもよいことになります。
C言語で用意される部品は、
人間の胃や腎臓や脳などの部位とは違います。
人間の部位は複雑に絡み合いながら、結合されています。
複雑につながっていることを有機的な結合といいます。
ですが、C言語の部品はプラモデルと同様に単純な結合です。
プラモデルの部品はせいぜい2,3カ所とつながっているだけです。
人間の部位が脳細胞のシナプスやホルモンを通して複雑に絡み合っているのとは、
対照的です。
単純に結合されているこれがC言語の強みなのです。
それに対してかつてのBASICは、部品同士が人間の部位のように複雑に絡み合っていました。
それで、BASICプログラムはスパゲティプログラムであると揶揄されていました。
箱の中身がいろいろな部品で変えられてしまうからです。
つまり、部品同士が複雑に絡み合いプログラムをわかりにくくしていたのです。
ただし、Visual Basicになりその欠点は解消されています。

ところで、先ほどから基本的にはという言葉が添えられていることに気がつきましたか。
実は、箱はその社員専用のもので他の社員は使えませんし、
箱そのものを渡す方法もないのに、
箱の中身を変えるように他の社員に依頼することができるという、
とても不思議な方法をC言語は用意しています。
ポインタを使う方法です。
箱そのものは渡せないが箱の中身は渡すことができるということを利用するのです。
箱は渡せないのに、どうして箱の中身を変えられるのでしょうか。
本当に謎めいていますよね。
次話では、この話に関連する引数(ひきすう)について学びます。
第1講第9話で、他の社員に仕事をお願いするときに、
仕事の内容を()内に書いて、仕事を依頼することがあり、
その括弧内に書いてあるものを引数と呼ぶ、と説明したことを覚えていますか。
どのような場面かと申しますと、
仕事を依頼する方が、いくつまで足していくのかを指定したいケースです。
1+2+3+・・・+a
つまり、aを指定したい場合です。
int main(){
  f(100); //社員f()に足し算をして結果を表示する仕事を命じている。
  return(0); //プログラムを閉めるためのお呪い
}
とすると、1から100までの和を求めて下さいと、
依頼することになります。
ただし、繰り返し処理を学んでいない現在この課題には答えられませんので、
今回は、aを2倍しなさいという課題ということにします。

第7話へ   第9話へ
 
002

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

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