マルチスレッド版数独自動生成ソフトC++コードを題材とする超初心者のためのVisual Studio C++講義
第2章 変数って何?
第4話 名称変更と1行1行の意味
1行1行の意味を説明する前に名称変更をすることにしました。
関数という意味の分からない言葉が入っていると躓きの基になると考え、
関数をすべて社員とすることにしました。
#include <iostream>//インクルードファイルの読み込み
#include<conio.h> //while(!_kbhit());を使うためのお呪い
using namespace std;//coutを使うときに必要なお呪い
void 挨拶社員();//ぼくは「こんにちは」と挨拶をする係です。
void 整数を扱う社員();//ぼくは整数を扱う係です。
int main() {
挨拶社員();//ぼくは「こんにちは」と挨拶をする係です。
整数を扱う社員();//ぼくは整数型変数を定義してその変数に整数値を代入する係です。
while(!_kbhit());//待機させるための命令
return 0;//int main() を終わるためのお呪い
}
void 挨拶社員(){//ぼくは「こんにちは」と挨拶をする係です。
cout << "こんにちは" << endl;//コンソール画面への表出
}
void 整数を扱う社員(){//ぼくは整数を扱う係です。
int 整数1;//整数1は整数型の変数であることを宣言します=整数1を整数型の変数であると定義(約束)します。
整数1 = 10;//整数1という箱に10を入れます。
cout<<整数1<<endl;
}
(初心者の方はコピペしてください。)


(少し線がずれていますがPrtSC(スマホのスクリーンショットに対応するものです。画面そのものをコピーする機能です)をしてコピペしているのでずれはご了承ください。)
名称変更の理由は、
関数に対して苦手意識を持っている人には、
関数という言葉が入っているだけでコード全体の意味がわからなくなってしまうだろうという配慮からです。
関数とは仕事の単位=細胞のことです。
それなのになぜ関数という名称がC言語やC++では関数というのかは、
関数という章で説明します。
関数という名称は、ちゃんとした理由があります。
そして、数学の関数も大変面白いものであることがわかるでしょう。
苦手意識のない方は名称を変更しないで関数のままでも結構です。
漢字にしても1つでも意味が分からない言葉があると、
全体がわからないという印象を持ってしまうのが、
人間の特徴なので名称変更を行ったわけです。
物事は、一気に説明することはできません。
理由は、「全体は部分であり、部分は全体である」からです。
解釈学的循環を思い出してください。
部分を理解するためには、全体を理解している必要がある

全体を理解するためには、部分を理解している必要がある
全体を理解するためには、部分を理解している必要がある

部分を理解するためには、全体を理解している必要がある
部分を理解するためには全体を理解していなければならないが、全体をいきなり読むことはできません。
それで最後まで読み通しても、部分を正確に把握していないので全体の理解も不十分になります。
第2回目の読解に頑張ったとしても全体の理解が正確ではないので、部分の理解も不十分なものになってしまいます。
部分と全体は無限循環をしてしまいますね。
そうすると無限回読まないと理解できないことになりますが、
人生は長くて100年です。
ですから、無限回読むことは不可能なので普通は2、3回読解して妥協します。
ですが、本当に理解したい本は10回から20回は読むべきです。
前に行ったことを繰り返します。
一気に全部を理解することは不可能なので、
なんとなくわかった段階で先へと読み進めます。
そして、ある程度進んだら最初から読み返すか、
必要だと思うところから読み返して、
読解を進めるしかないわけです。
読み返せば読み返すほど、あなたの理解は正確なものへと近づいていきます。
さて、では解説に入ります。
1行1行といってもすでに理解している行もありますから、
くどくなると思いますのでポイントだけ説明します。
最初に4、5行目の
void 挨拶社員();//ぼくは「こんにちは」と挨拶をする係です。
void 整数を扱う社員();//ぼくは整数を扱う係です。
プロトタイプ宣言と呼ばれますが、
その名前は覚えなくてもよいと思います。
4、5行目は出てくる社員のメンバー紹介であると理解すれば十分です。
ただし、この2行を削除するとビルドエラーします。
ただし、
#include <iostream>//インクルードファイルの読み込み
#include<conio.h> //while(!_kbhit());を使うためのお呪い
using namespace std;//coutを使うときに必要なお呪い
void 挨拶社員(){//ぼくは「こんにちは」と挨拶をする係です。
cout << "こんにちは" << endl;//コンソール画面への表出
}
void 整数を扱う社員(){//ぼくは整数を扱う係です。
int 整数1;//整数1は整数型の変数であることを宣言します=整数1を整数型の変数であると定義(約束)します。
整数1 = 10;//整数1という箱に10を入れます。
cout<<整数1<<endl;
}
int main() {
挨拶社員();//ぼくは「こんにちは」と挨拶をする係です。
整数を扱う社員();//ぼくは整数型変数を定義してその変数に整数値を代入する係です。
while(!_kbhit());//待機させるための命令
return 0;//int main() を終わるためのお呪い
}
とするとビルドエラーをしませんが、
私はこの書き方を勧めません。
理由は、最初に全体像を示すべきだからです。
2行多くなっても最初の書き方をすべきです。
社長であるint main()が出て来るのはC言語やC++の文法で定められているので、
名前だけでも社員の全員を把握してから、
それぞれの社員の個性や特徴は下の記述を読んで理解するという手順は、
仕事をする手順と同じだとは思いませんか。
最初に簡単な自己紹介をしてから仕事を始めますよね。
void 挨拶社員();//ぼくは「こんにちは」と挨拶をする係です。
void 整数を扱う社員();//ぼくは整数を扱う係です。
はそれと同じだと思ってください。
会社は社長を中心に動くものです。
社長の指示によって回っていくわけですから、
やはり社員より司令塔である社長の司令が最初に出て来るべきだと私は考えます。
int main() {
挨拶社員();//ぼくは「こんにちは」と挨拶をする係です。
整数を扱う社員();//ぼくは整数型変数を定義してその変数に整数値を代入する係です。
while(!_kbhit());//待機させるための命令
return 0;//int main() を終わるためのお呪い
}
void 挨拶社員()//ぼくは「こんにちは」と挨拶をする係です。
cout << "こんにちは" << endl;//コンソール画面への表出
}
void 整数を扱う社員(){//ぼくは整数を扱う係です。
int 整数1;//整数1は整数型の変数であることを宣言します=整数1を整数型の変数であると定義(約束)します。
整数1 = 10;//整数1という箱に10を入れます。
cout<<整数1<<endl;
}
という順番で書くことを私は強く勧めます。
ただし、好みですから2番目の書き方を好む方はそちらでもよいと思います。
それから、もう一つだけ注目してほしいことがあります。
それは、関数名の名前の冒頭が、
int main()
void 挨拶社員()
void 整数を扱う社員()
intとvoidになっている点です。
前に書き忘れましたが、int 整数1;//整数1は整数型の変数であることを宣言します=整数1を整数型の変数であると定義(約束)します。
のintはintegerの略で整数という意味です。
int 変数名; は変数型の宣言であると言われます。
ですが、宣言という言葉は日常で使う宣言とは異なる意味合いがあると感じませんか。
確かに整数1を整数型の変数であることを宣言してはいますから、
宣言でもよいと思いますが、注釈文に書いてある通りに、
int 整数1;//整数1を整数型の変数であると定義(約束)します。
の方が自然な日本語ではないでしょうか。
定義は確かに日常語ではありませんが、
数学で定義の意味は約束である、
ということは学んでいますよね。
使う言葉を定義するということはとても大切なことです。
言葉の使い方が異なっているだけで2人の主張は同じなのに、
言葉の定義をしっかりしていないために、
永遠に議論を繰り返すことは普通にあります。
ちゃんと言葉を定義してから議論するということをすれば、
無駄な議論をしなくて済むのです。
話を元に戻すと今回のプログラムコードでは関数名の冒頭がintとvoidになっています。
intの意味は説明しましたが、それでも int main() 社長名の前に整数という意味のintが来ることは、
納得できませんね。
実は、
return 0;//int main() を終わるためのお呪い
がヒントになります。
return 0; とは0を返すという意味です。
そして、0は整数ですね。
実は、
return 1;//int main() を終わるためのお呪い
return 2;//int main() を終わるためのお呪い
に変えてもビルドエラーすることはありません。
実際に変えてF5を押してビルドをやってみてください。
何の問題もありませんね。
0や1などの整数を返すといわれても意味が分かりませんよね。
どこに返すのでしょうか。
例えば、社員に対して1+2+3+・・・+100を計算して結果を返せ(報告せよ)ならば意味が分かります。
社長に命令されて計算して結果を返しているわけですから。
社長や他の社員から命じられてその仕事の結果を報告することは、全く普通のことです。
でも社長に社員が命令することはできませんね。
社報に載せる文章を書いていただけませんか、
お願いすることはできます。
整数0を返すのはどこに返すの?
あえて言えばシステムに返す、ということになりますがそんな説明では納得できませんよね。
ですから、私は昔は
void main() {
挨拶社員();//ぼくは「こんにちは」と挨拶をする係です。
整数を扱う社員();//ぼくは整数型変数を定義してその変数に整数値を代入する係です。
while(!_kbhit());//待機させるための命令
return 0;//int main() を終わるためのお呪い
}
と書いていました。
voidとは空という意味です。
2人の社員は
void 挨拶社員(){//ぼくは「こんにちは」と挨拶をする係です。
cout << "こんにちは" << endl;//コンソール画面への表出
}
void 整数を扱う社員(){//ぼくは整数を扱う係です。
int 整数1;//整数1は整数型の変数であることを宣言します=整数1を整数型の変数であると定義(約束)します。
整数1 = 10;//整数1という箱に10を入れます。
cout<<整数1<<endl;
}
仕事はしていますが、その結果については社長に報告していませんね。
何も報告しないのでvoid(空)です。
ですが、
void main() {
挨拶社員();//ぼくは「こんにちは」と挨拶をする係です。
整数を扱う社員();//ぼくは整数型変数を定義してその変数に整数値を代入する係です。
while(!_kbhit());//待機させるための命令
return 0;//int main() を終わるためのお呪い
}
の書き方は推奨されていません。
ですから、仕方なしにint main()としています。
私は体験していませんが、void main()では問題を起こすことがあるということなのでしょう。
ですから、
return 0;//int main() を終わるためのお呪い
注釈文に書いてある通りに理解すればよいのです。
そのうち気にならなくなります。
関数の章で詳しく説明しますが、数学では関数とは
y = f(x) であると学びました。
そして、次のような図(x を入れると y が出てくる機械の図)を示され説明されました。

xを左から入れて加工されてyとして出て来ると。
私の実家では温泉まんじゅうを作っていました。
上の図と同じであんこや皮の材料を上から入れると下から加工された温泉まんじゅうが出て来る機械があったのです。
あんこや皮の材料が(→x)に入り、加工されて(→y)饅頭として出てくるわけです。
例えば
ならばxが加工されて
になって出て来るということです。
そして、C言語やC++の面白い点は空をいれて空が出て来ることも認めているのです。
0をいれて0が出て来ると思えばよいわけです。
2人の社員は
void 挨拶社員(){//ぼくは「こんにちは」と挨拶をする係です。
cout << "こんにちは" << endl;//コンソール画面への表出
}
void 整数を扱う社員(){//ぼくは整数を扱う係です。
int 整数1;//整数1は整数型の変数であることを宣言します=整数1を整数型の変数であると定義(約束)します。
整数1 = 10;//整数1という箱に10を入れます。
cout<<整数1<<endl;
}
は仕事はするけど、その結果については報告していません。空報告です。voidです。
void 挨拶社員()・
void 整数を扱う社員()のいずれも()内は空白です。
つまり、空をいれて空が出て来るというわけです。
こんな変則的な関数ではなy = f(x) という普通の関数も『関数の章』で学びます。
今は、難しく考えず「そうなんだ」ぐらいの理解でよいのです。
何でも完璧に理解しようとする姿勢は理解の邪魔ものです。
ある程度読んでは必要なところまで戻って読み返すということを
最後までやりきれば必ずストーンと落ちる瞬間がやってきます。
さて、第4話は終了して第5話では実数型変数について学びます。