
前回の宿題
次のsub1, sub2, mainの3つの関数で構成するプログラムがあります。
このプログラムを実行した結果(出力される文字)を答えてください。
しげちゃん先生
回答を発表します。
No.4
No.1
No.3
No.2
No.3
No.5
以上です。
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()関数に入ります。

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

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

次に、sub2()関数を呼び出していますので、sub2()関数に入ります。

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

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

ここで、sub1()関数を抜け、呼び出し元の直後に戻ります。
次は、先ほどと同様sub2()関数が呼ばれ、「No.3」が出力されます。

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

次の処理は、「printf(“No.5\n”);」ですから、「No.5」が出力されます。
そして、最後にmain()関数を抜けたら、無事プログラム終了となります。
しげちゃん先生
関数呼び出し階層を図にすると、以下の通りです。


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