7章 H12.11.基本型

教科書の6.3有効範囲(スコープ)と記憶域期間(寿命)を参照のこと.

特に, 自動(auto)変数, 静的(static)変数, 大域(global)変数を区別して使用できるようにすること.

下に挙げるプログラムについて, 以下の問いに答えよ.

A.1
(1), (2), ..., (12) で参照される変数の値を答えよ. また, それぞれ(A), (B), ..., (L)のうちどの変数を参照してるかを答えよ. (A), (B), ..., (L)の各変数の初期化が起きるタイミングと, その変数の値がいつ変化するかを答えよ.

A.2
特に, func_C中(3)におけるaの値について, func_A, func_B 中の a との相違を述べよ.

A.3
特に, func_C中(7), (8), main中(12)におけるgの値について調べ, gの値が変化する過程を説明せよ.

#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;
}

以下は, 自分が用いるプロセッサ, コンパイラー, 設定に依存するので, 自分が調べた結果を答えること.

  1. △ 2進数,8進数,10進数,16進数を理解すること. 10進数で与えられた整数を, 2進数, 8進数, 16進数で表示するプログラムを作成せよ.

  2. int型変数で表すことができる整数の範囲を調べるためのプログラムを作成せよ. (LIST 7-2)これを用いて, 自分が用いている環境における整数の範囲を答えよ. 同様に, unsigned int型, float型, double型について答えよ.

    #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;
    }
    

  3. ☆ 例えば,int a = 30000; に 30000 を加えた時の結果を調べよ. 同様に十分に大きな整数に整数を加えた時の結果を調べよ. その理由を答えよ.

  4. ☆ sizeof を用い,自分が用いている環境およびコンパイラを用いた場合の int型, float型, double型変数のサイズを調べよ. (List7-4参照)

  5. ☆ int a[10]; double b[10]; のような配列のサイズはいくらか調べよ. さらにどのように決まっているか答えよ. (List 7-13)

  6. △ ビット単位の演算について理解する. (Table 7-2) 演算をする前と後の値を2進数で表示し,確認するプログラムを作成し, 自分で調べた値と演算について答えよ. 特に,^, ~ は不慣れだと思われるので,この機会に習熟しておくこと.

  7. △ 同様にシフト演算子により演算した結果を出力するプログラムを作成せよ. (Table 7-3) 自分で調べた値と演算について答えよ.

講義終了時に, 上で作成したプログラムと実行した結果を全てをメールで送ること. 本文に, 氏名, 学籍番号を明記すること.



(c)1999-2013 Tetsuya Makimura