関数 解答ページ | Programming Place Plus C言語編 第9章

トップページC言語編第9章

問題①

問題① 次のプログラムの実行結果はどうなりますか?

#include <stdio.h>

void f1(int n);
void f2(int n1, int n2);

int main(void)
{
    f1(1);
    f2(10, 20);
}

void f1(int n)
{
    f2(n, n + 1);
}

void f2(int n1, int n2)
{
    printf("%d, %d\n", n1, n2);
}


関数がいくつあって、どこに書かれていようとも、プログラムの開始は main関数からというルールは変わりません。そのため、まずは f1(1); が実行され、f1関数に進みます。このとき実引数の 1 が渡され、f1関数の仮引数n の値になります。

f1関数の定義をみると、f2(n, n + 1); とあります。したがって今度は f2関数へ進みます。このとき、実引数の nn + 1 を計算した値が、f2関数の仮引数n1、n2 の値になります。n の値は 1 なので、1 と 2 が渡されます。

f2関数は n1 と n2 の値を出力しています。それぞれ 1 と 2 ですから、出力結果はこうです。

1, 2

f2関数にはこれ以上処理がありませんから、呼び出し元に戻ります。戻った先の f1関数にもこれ以上の処理がありませんから、さらに呼び出し元に戻ります。戻り先は main関数内の f1(1); の直後です。f2(10, 20); があるので、次は f2関数に進みます。今回の実引数は 1020 です。

f2関数では n1 と n2 の値を出力します。今回は 1020 なので、出力結果はこうです。

10, 20

f2関数にはこれ以上処理がありませんから、呼び出し元に戻ります。今回は main関数から直接来たので、戻り先も main関数です。main関数にはこれ以上処理がありませんから、これで main関数も終了となり、プログラムの実行が終わります。

最終的に出力結果はこうです。

1, 2
10, 20

このような処理の流れは、Visual Studio のステップ実行の機能を使って確認できます。「Visual Studio編>ステップ実行」のページで解説している、ステップインを使ってみるといいでしょう。

問題②

問題② int型で渡される引数の値を、2乗して返す関数を作ってください。


#include <stdio.h>

// 2乗を計算する
// num: 元の数値
// 戻り値: num を2乗した結果
int pow2(int num)
{
    return num * num;
}

int main(void)
{
    int num = 10;
    int num2;

    // 2乗を求める
    num2 = pow2(num);

    // 1乗から4乗までを出力
    printf("num:   %d\n", num);
    printf("num^2: %d\n", num2);
    printf("num^3: %d\n", num2 * num);
    printf("num^4: %d\n", num2 * num2);
}

実行結果:

num:   10
num^2: 100
num^3: 1000
num^4: 10000

2乗を返す関数は簡単に作れますね。3乗や4乗が必要であれば、それ専用の関数を用意してもいいのですが、少々やりすぎな感じがします。実際、こういう要求は際限なく出てくるものです。

理想的には、「何乗したいのか」も引数として指定できるような関数を作ることです。しかし、このような関数を作るには、ここまでの知識だけでは不足しています。

【上級】第12章で for文を学ぶと作れるようになります。あるいは、標準ライブラリ関数の pow関数を使う方法もあります。


参考リンク


更新履歴

’2018/2/4 全面的に文章を見直し、修正を行った。

’2018/1/31 「キーボードからの入力」といった表現を、標準入力からの入力に改めた。

’2012/8/15 問題②の問題文の不備を修正。

’2009/2/11 新規作成。



第9章のメインページへ

C言語編のトップページへ

Programming Place Plus のトップページへ



はてなブックマーク に保存 Pocket に保存 Facebook でシェア
X で ポストフォロー LINE で送る noteで書く
rss1.0 取得ボタン RSS 管理者情報 プライバシーポリシー
先頭へ戻る