2.3 例題(1)

  4.例題2-4 大域的スコープ
 関数ブロックの外で変数を定義すれば、その変数は定義したところからプログラムソースファイルの最後まで(大域的)スコープ(有効範囲)を持ちます。

 以下のプログラムを実行したときに、その出力は、
address of i (in main)  lval_1 = ADDRESS1
value of i   (in main)  val_1  = VALUE1
address of i (in test)  lval_2 = ADDRESS2
value of i   (in test)  val_2  = VALUE2
value of i   (in test)  val_3  = VALUE3
value of i   (in main)  val_4  = VALUE4
のようになります。このとき、
Q1: ADDRESS1 と ADDRESS2 は等しくなりますか?
Q2: VALUE1, VALUE2, VALUE3, VALUE4 の値はどうなりますか?
 なお、下のプログラムで変換文字%pは、変数のメモリアドレスの表示に用いられるものです。
(a)プログラムリスト

#include <stdio.h>

void test(void);
int i;

int main(void)
{
 i = 10;

 /* main() における変数 i の記憶場所の表示 */
 printf("address of i (in main)  lval_1 = %p\n",&i);

 /* main() 内 における変数 i の値の表示 */
 printf("value of i   (in main)  val_1  = %d\n",i);
 test();
 printf("value of i   (in main)  val_4  = %d\n",i);
}

void test(void)
{
 /* 関数 test() 内 における変数 i の記憶場所の表示 */
 printf("address of i (in test)  lval_2 = %p\n",&i);

  /* 関数 test() 内 における変数 i の値の表示 */
 printf("value of i   (in test)  val_2  = %d\n",i);
 i = 20;
 printf("value of i   (in test)  val_3  = %d\n",i);
}

(b)結果
Q1の答え:
ADDRESS1 と ADDRESS2は値(記憶番地)は同じ値を持つ。
Q2の答え:
VALUE1 = 10
VALUE2 = 10
VALUE3 = 20
VALUE4 = 20

※実際にプログラムを実行して確かめてみよう。