#27 [C/C++] 関数(その1)
今回の学習ポイント
[-]プログラミングする機器 なし
[-]プログラミングするソフト なし
[〇]プログラム言語と標準機能 C/C++文法
[-]プログラム拡張機能 なし
[-]プログラムを実行する機器 なし
[-]プログラムの処理対象 なし
[-]関連する一般教養・知識 なし
今回は「関数」について解説します。
関数って聞くと、学校で習う数学の関数を思い浮かべる人は多いでしょう。C/C++でいう関数は、数学の関数とは違います。
関数も例にもれず、プログラミングの世界で似たような言葉があります。
ファンクション(function)=機能
プロシージャ(procedure)=手続き など
どれも機能は同じです。プログラム言語や使い方などで呼び方が変わりますが、プログラミングの世界では「関数」と呼ぶことが一番多いようです。
では、関数とは何か
それは、「一定の処理を一括りしたもの」です。
具体的にみてもらった方が理解が早いので、次に例示します。
lesson27.cppを作成・実行して下さい。
#include <iostream>
using namespace std;
int msg()
{
cout << "hello" << endl;
return 0;
}
int main()
{
msg();
msg();
msg();
return 0;
}
int msg() {・・・} が関数であり、見ての通りmain()の中で3回実行(これを「呼び出し」という)しています。
関数名(例ではmsgの部分)は、私たちが好きに名前を付けられます。但し、C/C++で標準的に提供している関数名や命令語(これを予約語という)以外にする必要があります。
上の例は、関数にするまでも無い処理ですが、関数として括りだす意義の一つは、「再利用」です。
同じ処理を何度もするとき、プログラムの複数箇所に同じ処理をコーディングすることになります。関数にしてまとめておけば、関数を呼び出すことで実現できます。
また、ロジックの変更に迫られた時、プログラムの複数箇所に記述されていると、全ての箇所を変更する必要がありますが、変更漏れが起きるかもしれません。
でも関数で一括りにして再利用していれば、関数のロジック1箇所を変更すれば、全て変更したことになります。こうした「保守性」も関数にする意義の一つです。
関数には、大きく2種類あります
関数で処理した結果を呼び出し元に返すものと返さないものです。
#include <iostream>
using namespace std;
// 処理した結果を呼び出し元に返さない関数
void msg()
{
cout << "hello" << endl;
return;
}
// 処理した結果を呼び出し元に返す関数
int sum()
{
int ans;
ans = 2 + 3;
return ans;
}
int main()
{
int rtn;
msg();
rtn = sum();
cout << rtn << endl;
return 0;
}
msg関数は、"hello"がコンソール画面に表示する関数で、呼び出し元であるmain関数で、msg関数での処理結果を使用しません。
sum関数は、2 + 3を計算し変数ansに答えを格納しています。return ans;で呼び出し元に答えを返しています。呼び出し元のmain関数では、sum関数の結果を変数rtnに格納し、それをcoutでコンソール画面に表示しています。
関数の書式は、次の通りです
戻り値の型 関数名()
{
// 関数の処理
}
msg関数で、戻り値の型にvoidとあります。初めて出てきました。
void=空っぽという意味です。戻り値が空っぽ、つまり何も返さないということになります。この時、関数の最後には、return(戻る)だけ記述します。
sum関数の戻り値の型はint型ですので、変数の宣言と同じ意味合いで数値を返す関数ということです。sum関数の中にある変数ansの型がintであり、returnの所でans(int型)をつけて戻しています。
mainも関数です。今まで、丸呑みして覚えてきて貰いましたが、int型を返す関数です。ここで一つ疑問を持たれる方もいるかもしれませんので、解説しておきます。
疑問1 main関数の戻り値の型をintからvoidにしても良いのではないか
疑問2 main関数の戻り値の型をintにしておくとどこに戻るのか
main関数は、パソコンとの約束事でプログラムを実行する時、必ずmain関数を呼び出す と以前解説しました。だから必ずプログラムを作るときmain関数は必要であると。
もう少し解説すると、プログラムの実行とは、main関数の最初の命令からreturnまでで記述された処理ということになります。
そうすると、main関数のreturnでプログラムが終わるなら、戻り値を使うことが無いからvoid型で良いのではないか というのが疑問1です。
ここをvoidに変更してもreturn 0;をreturnに変更しても問題ないということになります。実際プログラムを修正して実行しても動作する というのが答えです。
では、int型にする意味があるのか。int型にするとどこに戻るのか。という疑問2があります。
結論から言えば、プログラムの呼び出し元に返されています。今は固定で0を返していますから、この点でも意味をなさないのですが、プログラムが何らかの異常で処理を途中で終了した場合に0以外の数値を返却するようにしたとします。そうすることでプログラムの呼び出し元に、その数値が返されることになります。
プログラムの呼び出し元として、よく使われるのはバッチファイルというものです。バッチファイルとは、コマンドの処理順番を列記してまとめて実行できるものと以前少しだけ紹介しました。ここでプログラムの実行(呼び出し)もでき、実行直後にerrorlevelというもので判定する処理を記述できます。
今回は、関数について次のことを説明しました。
1)関数の書式
2)関数には2種類ある(処理結果を返す関数と処理結果を返さない関数)
3)関数にする意義は、再利用と保守性
#1から順番に読むと理解できるように説明しています。(つもりです。)
もし良かったら、読んで貰えると有難いです。
この記事が気に入ったらサポートをしてみませんか?