© 2005 Martin J. Dürst 青山学院大学
#include <stdio.h>
関数とグローバル変数の場合区別される
{ ... { int temp; temp = a; a = b; b = temp; } ... }
static
指定子を使えば翻訳ユニット別に局所的にも定義できる
(内部結合)例 | 記述場所 | 宣言・定義 | 存在期間 | 自動初期化 | 初期化 | 使用・識別範囲 |
int i; | ブロック先頭 | 定義 | 関数 | 不定 | 式 | ブロック |
static int i; | ブロック先頭 | 定義 | プログラム | 0 | 定数式 | ブロック |
static int i; | 関数外、.c/.cpp | 定義 | プログラム | 0 | 定数式 | 翻訳ユニット |
int i; | 関数外、.c/.cpp | 定義 | プログラム | 0 | 定数式 | プログラム |
extern int i; | .h | 宣言 | - | - | - | プログラム |
例 | 記述場所 | 宣言・定義 | 存在期間 | 使用・識別範囲 |
static int f(int i) {...} | .c/.cpp | 定義 | プログラム | 翻訳ユニット |
static int f(int i); | .c/.cpp | 宣言 | プログラム | 翻訳ユニット |
int f(int i) {...} | .c/.cpp | 定義 | プログラム | プログラム |
int f(int i); | .h (.c/.cpp) | 宣言 | - | プログラム |
scanf
等での
&
引数か初期化の二次元配列の場合には最初の角括弧だけが空で良い
例: matrix[][4]
, tensor[][2][2]
すごく単純な例: 1 から n までの合計:
int sum (int n) { if (n <= 0) return 0; else return n + sum (n-1); }
ある数を n 進数で出力する:
char letters[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; void printNary (int i, int n) { if (i >= n) { printNary (i/n, n); putchar (letters[i%n]); } else putchar (letters[i]); }
auto
変数は呼び出しごと別に存在するwhile
と適切なデータ構造と置き換えられる