本文へスキップ

技術士試験(情報工学部門)・情報技術者試験。ファーストマクロ。


Since 2016.4.19

平成17年度 技術士第一次試験問題【専門科目】

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 を出力する。

W−1 目次 W−3