第24〜33回までの要点を チートシート でおさらいし、コード読み取り6問 と 「よくあるミス」チェックリスト で定着度を確認します。
// 戻り値型 関数名(引数の型 仮引数, ...) int square(int x) { return x * x; } int main(void) { printf("%d\n", square(5)); // 25 }
voidreturn で値を返す(途中で抜けることもできる)void add10(int x) { x += 10; // この x はコピー } int main(void) { int a = 5; add10(a); printf("%d\n", a); // 5 のまま! }
int g = 100; // グローバル void f(void) { int x = 1; // f だけのローカル } int main(void) { int x = 2; // main の x(別物) f(); printf("%d %d\n", x, g); // 2 100 }
void fill(int a[], int n) { for (int i = 0; i < n; i++) a[i] = 7; } int main(void) { int a[3] = {0}; fill(a, 3); // a は {7, 7, 7} に変わる }
sizeof で長さを取れない(別途長さを渡す)int factorial(int n) { if (n <= 1) return 1; // 停止条件! return n * factorial(n - 1); } // factorial(4) = 4*3*2*1 = 24
// 先頭で宣言(実装は後でも OK) int add(int, int); int main(void) { printf("%d\n", add(2, 3)); } int add(int a, int b) { return a + b; }
int square(int x) { return x * x; } int main(void) { printf("%d\n", square(3) + square(4)); }
square(3) = 9、square(4) = 16。void add10(int x) { x += 10; } int main(void) { int a = 5; add10(a); printf("%d\n", a); }
x は a とは 別の変数。x に 10 を足しても a は変わらない。void add10(int *p))か、戻り値で受け取る(a = add10(a))。
void setZero(int a[], int n) { for (int i = 0; i < n; i++) a[i] = 0; } int main(void) { int a[3] = {7, 8, 9}; setZero(a, 3); printf("%d %d %d\n", a[0], a[1], a[2]); }
int g = 100; void f(void) { int g = 1; // 同名のローカル printf("f: %d\n", g); } int main(void) { f(); printf("main: %d\n", g); }
int g = 1; は ローカル。グローバル g とは別物で、関数内ではローカルが優先(シャドーイング)。int fact(int n) { if (n <= 1) return 1; return n * fact(n - 1); } printf("%d\n", fact(4));
n <= 1 で return 1 が再帰を止める。
void show(int a[]) { printf("%lu\n", sizeof a); } int main(void) { int a[5] = {0}; show(a); }
sizeof a は何を返す?int a[] は ポインタ扱い。void show(int a[], int n))。
return の型が合っていないint 戻り値の関数で double を返すと暗黙変換される。void なのに return x; はエラー。
sizeof で取ろうとした