前回の宿題
次のsub1, sub2, mainの3つの関数で構成するプログラムがあります。
このプログラムを実行した結果(出力される文字)を答えてください。

しげちゃん先生
回答を発表します。
No.4
No.1
No.3
No.2
No.3
No.5
以上です。

新人Y子
私の思ってたのとちょっと違いました…
解説をお願いします。

しげちゃん先生
はい。ではまずエントリーポイントに注目してください。

新人Y子
エントリーポイントとは、main()関数の事ですね!

しげちゃん先生
はい。その通りです。
開始したら、まずmain()関数が呼び出されます。
main()関数の最初にある処理は、「printf(“No.4\n”);」ですから、「No.4」が出力されます。
次に、sub1()関数を呼び出していますので、sub1()関数に入ります。

しげちゃん先生
sub1()関数の最初にある処理は、「printf(“No.1\n”);」ですから、「No.1」が出力されます。
次に、sub2()関数を呼び出していますので、sub2()関数に入ります。


しげちゃん先生
sub2()関数にある処理は、「printf(“No.3\n”);」ですから、「No.3」が出力されます。

ここで、sub2()関数を抜け、呼び出し元の直後に戻ります。

しげちゃん先生
次の処理は、printf(“No.2\n”);」ですから、「No.2」が出力されます。
次は、先ほどと同様sub2()関数が呼ばれ、「No.3」が出力されます。

ここで、sub1()関数を抜け、呼び出し元の直後に戻ります。

次の処理は、「printf(“No.5\n”);」ですから、「No.5」が出力されます。
そして、最後にmain()関数を抜けたら、無事プログラム終了となります。

しげちゃん先生
関数呼び出し階層を図にすると、以下の通りです。

新人Y子
関数は、階層的の呼び出されることが、なんとなく分かってきました。
ちなみに、この処理ではsub2()関数が2回呼び出していますが、同じ関数を何度も呼び出して問題ないのでしょうか?
しげちゃん先生
はい。もちろんです。
関数に分けることを「関数化」といいます。
特に、同じ処理をまとめて共通化する目的で行う「関数化」は、メリットが大きくなりますので、どんどん1つに纏めましょう。(注1)
テクトレージマン
次回に続く

注1) この例のsub2()関数は、あくまで処理の共通化の説明用となります。
本関数は、処理が1行しかありませんので、関数化のメリットはあまりありません。

0