演習課題「間違い探し」
右のコードエリアには、2 つの値の合計を出力する sum 関数が定義されています。
「sum 関数が呼び出された回数」を出力したいのですが、期待通りに動作しません。
count 変数の値が「sum 関数が呼び出された回数」になるように、コードを修正してください。
プログラムを実行して、正しく出力されれば演習課題クリアです!
期待する出力値
3
- 1回目
7
- 2回目
11
- 3回目
15
- 4回目
#04:スコープを理解しよう
変数の有効範囲であるスコープについて学習します。関数やループ処理を使う上で重要な概念なので、しっかりと理解しましょう。
スコープとは、変数の有効範囲のことです。
異なる関数では、ローカル変数のスコープが分離しています。
そのため、同じ名前の変数があっても、独立して利用できます。
下のコードでは、
・print_one 関数の a 変数
・print_two 関数の a 変数
・main 関数の a 変数
は異なるスコープを持つので、それぞれ別の変数として利用できます。#include <stdio.h>
void print_one(void)
{
int a = 1;
printf("%d\n", a);
}
void print_two(void)
{
int a = 2;
printf("%d\n", a);
}
int main(void)
{
int a = 3;
print_one();
print_two();
printf("%d", a);
}
・出力結果1
2
3
スコープが関数の中に限られている変数は「ローカル変数 (局所変数)」と呼ばれます。
関数の中で宣言した変数はローカル変数です。
ローカル変数は、その関数の中でだけ使うことができます。他の関数からは直接アクセスできません。#include <stdio.h>
int sum(int x, int y)
{
a = 3; // エラーになる
return x + y;
}
int main(void)
{
int a = 10;
int b = 20;
printf("%d\n", sum(a, b));
}
この例では、a 変数は main 関数のローカル変数なので、sum 関数からは直接アクセスできません。
関数の外側で宣言された変数は「グローバル変数 (大域変数)」と呼ばれます。
グローバル変数は、複数の関数から直接アクセスできます。#include <stdio.h>
int num = 0;
// num に 1 を足す
void add_one(void)
{
num++;
}
// num に 2 を足す
void add_two(void)
{
num += 2;
}
int main(void)
{
printf("%d\n", num); // 出力 : 0
add_one();
printf("%d\n", num); // 出力 : 1
add_two();
printf("%d\n", num); // 出力 : 3
add_one();
add_one();
printf("%d\n", num); // 出力 : 5
}
グローバル変数を多用すると、
・プログラムのどこで値を書き換えているのかがわかりにくくなる
・間違えて値を書き換えてしまう
といった問題が起きる場合があります。
また、グローバル変数と同じ変数名の、ローカル変数を宣言することができます。
これが意図しない動作を引き起こす原因になることがあります。#include <stdio.h>
int num = 0;
void f1(void)
{
// 「int num ...」とすると、この num は f1 関数のローカル変数になる
// つまり、グローバル変数の num とは別物になるので、グローバル変数の値は書き換わらない
int num = 1;
}
void f2(void)
{
// この num はグローバル変数
num = 2;
}
int main(void)
{
printf("%d\n", num); // 出力 : 0
f1(); // グローバル変数の値は変わらない
printf("%d\n", num); // 出力 : 0
f2(); // グローバル変数の値が書き換えられる
printf("%d\n", num); // 出力 : 2
}
このチャプターで作成したコードです。// スコープを理解しよう
#include <stdio.h>
int count = 0;
int sum(int x, int y)
{
count++;
return x + y;
}
int main(void)
{
int a = 10;
int b = 20;
printf("%d\n", sum(a, b));
printf("sum が呼び出された回数 : %d 回\n", count);
printf("%d\n", sum(a, b));
printf("sum が呼び出された回数 : %d 回\n", count);
printf("%d\n", sum(a, b));
printf("sum が呼び出された回数 : %d 回\n", count);
}
- 変数のスコープ - 超初心者向けプログラミング入門
https://programming.pc-note.net/c/scope.html