前回の宿題
次のsub1, sub2, mainの3つの関数で構成するプログラムがあります。
このプログラムを実行した結果(出力される文字)を答えてください。
[speech_bubble type=”std” subtype=”L1″ icon=”itokuma-normal.png” name=”しげちゃん先生”]回答を発表します。
No.4
No.1
No.3
No.2
No.3
No.5
以上です。
[/speech_bubble]
[speech_bubble type=”std” subtype=”R1″ icon=”sanoyu-normal.png” name=”新人Y子”]私の思ってたのとちょっと違いました…
解説をお願いします。
[/speech_bubble]
[speech_bubble type=”std” subtype=”L1″ icon=”itokuma-normal.png” name=”しげちゃん先生”]はい。ではまずエントリーポイントに注目してください。
[/speech_bubble]
[speech_bubble type=”std” subtype=”R1″ icon=”sanoyu-normal.png” name=”新人Y子”]エントリーポイントとは、main()関数の事ですね!
[/speech_bubble]
[speech_bubble type=”std” subtype=”L1″ icon=”itokuma-normal.png” name=”しげちゃん先生”]はい。その通りです。
開始したら、まずmain()関数が呼び出されます。
main()関数の最初にある処理は、「printf(“No.4\n”);」ですから、「No.4」が出力されます。
次に、sub1()関数を呼び出していますので、sub1()関数に入ります。
[/speech_bubble]
[speech_bubble type=”std” subtype=”L1″ icon=”itokuma-normal.png” name=”しげちゃん先生”]sub1()関数の最初にある処理は、「printf(“No.1\n”);」ですから、「No.1」が出力されます。
次に、sub2()関数を呼び出していますので、sub2()関数に入ります。
[/speech_bubble]
[speech_bubble type=”std” subtype=”L1″ icon=”itokuma-normal.png” name=”しげちゃん先生”]sub2()関数にある処理は、「printf(“No.3\n”);」ですから、「No.3」が出力されます。
ここで、sub2()関数を抜け、呼び出し元の直後に戻ります。
[/speech_bubble]
[speech_bubble type=”std” subtype=”L1″ icon=”itokuma-normal.png” name=”しげちゃん先生”]次の処理は、printf(“No.2\n”);」ですから、「No.2」が出力されます。
次は、先ほどと同様sub2()関数が呼ばれ、「No.3」が出力されます。
ここで、sub1()関数を抜け、呼び出し元の直後に戻ります。
次の処理は、「printf(“No.5\n”);」ですから、「No.5」が出力されます。
そして、最後にmain()関数を抜けたら、無事プログラム終了となります。
[/speech_bubble]
[speech_bubble type=”std” subtype=”L1″ icon=”itokuma-normal.png” name=”しげちゃん先生”]関数呼び出し階層を図にすると、以下の通りです。
[/speech_bubble]
[speech_bubble type=”std” subtype=”R1″ icon=”sanoyu-normal.png” name=”新人Y子”]関数は、階層的の呼び出されることが、なんとなく分かってきました。
ちなみに、この処理ではsub2()関数が2回呼び出していますが、同じ関数を何度も呼び出して問題ないのでしょうか?
[/speech_bubble]
[speech_bubble type=”std” subtype=”L1″ icon=”itokuma-normal.png” name=”しげちゃん先生”]はい。もちろんです。
関数に分けることを「関数化」といいます。
特に、同じ処理をまとめて共通化する目的で行う「関数化」は、メリットが大きくなりますので、どんどん1つに纏めましょう。(注1)
[/speech_bubble]
[speech_bubble type=”std” subtype=”R1″ icon=”techtrageman-normal.png” name=”テクトレージマン”]次回に続く[/speech_bubble]
注1) この例のsub2()関数は、あくまで処理の共通化の説明用となります。
本関数は、処理が1行しかありませんので、関数化のメリットはあまりありません。