教科書の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;
}
講義終了時に, 上で作成したプログラムと実行した結果を全てをメールで送ること. 本文に, 氏名, 学籍番号を明記すること.