教科書の6.3有効範囲(スコープ)と記憶域期間(寿命)を参照のこと.
特に, 自動(auto)変数, 静的(static)変数, 大域(global)変数を区別して使用できるようにすること.
下に挙げるプログラムについて, 以下の問いに答えよ.
#include <stdio.h> #include <stdlib.h> /* local 変数: local 変数は ブロック内でのみ有効. auto 変数はブロックの外では, その値や領域も残っていない. static 変数は残っている. ブロック内でのみ代入や参照が可能. global 変数: ブロックの外で宣言する. 複数の関数で代入や参照ができる. */ int g = 10; // (A) g: global int func_A(int x) // (B) x: local, auto. { int a = 20; // (C) a は local, auto a += 2000; printf("(1) a=%d\n", a); return a; } int func_B(int x) // (D) x: local, auto { int a = 30; // (E) a: local, auto. func_A 中の x, a とは別の変数. a += 3000; printf("(2) a=%d\n", a); return a; } int func_C(int x) // (F) { static int a = 40; // (G) a: local, static. a += 4000; printf("(3) a=%d\n", a); // ここに注目!!! return a; } int func_D(int x) // (H) { static int a = 50; // (I) a: local, static. func_C 中の x とは別の変数. a += 5000; printf("(4) a=%d\n", a); return a; } int func_E(int x) // (J) { printf("(5) g=%d\n", g); // global 変数の参照. g += 6000; // global 変数への代入. printf("(6) g=%d\n", g); return g; } int func_F(int x) // (K) { // g は func_E 中と同一の変数. printf("(7) g=%d\n", g); // global 変数の参照. g += 7000; // global 変数への代入. printf("(8) g=%d\n", g); // ここに注目!!! return g; } int main(void) { int a; // (L) a: local, auto. a = 80; // local. func_A, func_Bの中の a とは別の変数. printf("(9) a=%d\n", a); printf("(10) g=%d\n", g); func_A(-1); func_B(-1); func_C(-1); // 3回 func_Cを呼び出してみる. func_C(-1); func_C(-1); func_D(-1); func_E(-1); func_F(-1); printf("(11) a=%d\n", a); printf("(12) g=%d\n", g); return EXIT_SUCCESS; }
以下は, 自分が用いるプロセッサ, コンパイラー, 設定に依存するので, 自分が調べた結果を答えること.
コンピューターの内部では, 2つの値しか取り得ない1ビットを最小単位として, 演算, 記憶が行なわれている. 2進数により, ビットを単位とする値を直接表記できる.
ビットより大きな扱いやすい単位として, 8ビットを1単位とする 1バイトが用いられる. 16進数により, バイトを単位とする値を直接表記できる.
#include <stdio.h> #include <float.h> int main(void) { printf("float型で表現できる範囲: %e --- %e\n", FLT_MIN, FLT_MAX); printf("double型で表現できる範囲: %e --- %e\n", DBL_MIN, DBL_MAX); return 0; }
講義終了時に, 上で作成したプログラムと実行した結果を全てをメールで送ること. 本文に, 氏名, 学籍番号を明記すること.