問題① 次のプログラムの実行結果はどうなりますか?
#include <stdio.h>
void f1(int n);
void f2(int n1, int n2);
int main(void)
{
(1);
f1(10, 20);
f2}
void f1(int n)
{
(n, n + 1);
f2}
void f2(int n1, int n2)
{
("%d, %d\n", n1, n2);
printf}
関数がいくつあって、どこに書かれていようとも、プログラムの開始は
main関数からというルールは変わりません。そのため、まずは
f1(1);
が実行され、f1関数に進みます。このとき実引数の
1
が渡され、f1関数の仮引数n の値になります。
f1関数の定義をみると、f2(n, n + 1);
とあります。したがって今度は f2関数へ進みます。このとき、実引数の
n
と n + 1
を計算した値が、f2関数の仮引数n1、n2 の値になります。n の値は 1
なので、1 と 2 が渡されます。
f2関数は n1 と n2 の値を出力しています。それぞれ 1 と 2
ですから、出力結果は 1, 2
になります。
f2関数にはこれ以上処理がありませんから、呼び出し元に戻ります。戻った先の
f1関数にもこれ以上の処理がありませんから、さらに呼び出し元に戻ります。戻り先は
main関数内の f1(1);
の直後です。f2(10, 20);
があるので、次は f2関数に進みます。今回の実引数は 10
と
20
です。
f2関数では n1 と n2 の値を出力します。今回は 10
と
20
なので、出力結果は 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乗を求める
= pow2(num);
num2
// 1乗から4乗までを出力
("num: %d\n", num);
printf("num^2: %d\n", num2);
printf("num^3: %d\n", num2 * num);
printf("num^4: %d\n", num2 * num2);
printf}
実行結果:
num: 10
num^2: 100
num^3: 1000
num^4: 10000
2乗を返す関数は簡単に作れますね。3乗や4乗が必要であれば、それ専用の関数を用意してもいいのですが、少々やりすぎな感じがします。実際、こういう要求は際限なく出てくるものです。
理想的には、「何乗したいのか」も引数として指定できるような関数を作ることです。しかし、このような関数を作るには、ここまでの知識だけでは不足しています。
【上級】第12章で for文を学ぶと作れるようになります。あるいは、標準ライブラリ関数の pow関数を使う方法もあります。
return 0;
を削除(C言語編全体でのコードの統一)全面的に文章を見直し、修正を行った。
「キーボードからの入力」といった表現を、標準入力からの入力に改めた。
問題②の問題文の不備を修正。
新規作成。
Programming Place Plus のトップページへ
はてなブックマーク に保存 | Pocket に保存 | Facebook でシェア |
X で ポスト/フォロー | LINE で送る | noteで書く |
RSS | 管理者情報 | プライバシーポリシー |