平成17年度 技術士第一次試験問題【専門科目】
【16】情報工学部門
W−2
次のC言語のプログラムを実行したときに表示される結果を選べ。
ただし、& は変数のアドレスを得る演算子、* はアドレスが指しているメモリの
内容を得る演算子、++ はメモリの内容に1を加える演算子である。

#include <stdio.h>
int sub (int *x, int *y) {
 (*x)++;
 (*y)++;
 return *x + *y;
}
main () {
 int a = 0, b = 0;
 b = sub(&a, &a);
 printf("%d %d\n", a, b);
}

 @ 0 2
 A 0 3
 B 1 3
 C 2 3
 D 2 4



【正解】 D


sub(&a, &a) で aのアドレスを引数としているが、
sub (int *x, int *y) で同じアドレスが指しているメモリの値を
それぞれで定義しているところがポイントになる。
(*x) の値と(*y)の値は連動する。

以下のように変数の値が変化していく。

int a = 0, b = 0 ・・・ (a, b) = (0, 0)
sub(&a, &a) ・・・ (a, b) = (0, 0)
 
sub(int *x, int *y) ・・・ (a, b) = (0, 0), (*x, *y) = (0, 0)
  (*x)++ ・・・ (a, b) = (1, 0), (*x, *y) = (1, 1)
  
(*y)++ ・・・ (a, b) = (2, 0), (*x, *y) = (2, 2)
  
return *x + *y ・・・ (a, b) = (2, 0), (*x, *y) = (2, 2)
b = sub(&a, &a)
・・・ (a, b) = (2, 4)
printf("%d %d\n", a, b);  
2 4 を出力する。


EXCELのマクロのご相談なら ファーストマクロ 



W−1 目次 W−3
ファーストマクロ TOPページ