C++開発職向け2024年新卒筆記試験問題と解説

一、単一選択問題

1-1 配列 int a[2][3]; が宣言されているとき、a の要素への正しいアクセス方法は?

  • A. a[0][1+1]
  • B. a[1][3]
  • C. a[1,3]
  • D. a(1)(1)

1-2 関数オーバーロードに関する正しい記述は?

  • A. オーバーロード関数の名前は異なってもよい
  • B. 引数の個数が必ず異なる必要がある
  • C. 戻り値の型が異なっていなければならない
  • D. 引数リストが異なっていなければならない

1-3 次のコードの実行結果として正しいのは?

int CY = -1;
do {
    CY = CY * CY;
} while (!CY);
  • A. ループは1回だけ実行される
  • B. ループは2回実行される
  • C. 無限ループになる
  • D. 文法エラーがある

1-4 char XZ[] = "ChangYou"; と定義されたとき、配列 XZ が占めるメモリサイズは?

  • A. 6バイト
  • B. 7バイト
  • C. 8バイト
  • D. 9バイト

1-5 二次元配列 a の要素 a[i][j] をポインタでアクセスする正しい方法は?

  • A. *(a+i+j)
  • B. *(*(a+i)+j)
  • C. *(a+i)+j
  • D. *a+i+j

1-6 次のコードをビッグエンディアン環境で実行したときの出力は?

union MyUnion {
    int a;
    short b;
};

int main() {
    MyUnion value;
    value.a = 3;
    printf("%d", value.b & 1);
}
  • A. 3
  • B. 1
  • C. 2
  • D. 0

1-7 次のコードの出力は?

int main() {
    int a = 10;
    int* b = &a;
    *b = 0;
    std::cout << a;
}
  • A. 0
  • B. 10
  • C. 不確定
  • D. 上記以外

1-8 次のコードの出力は?

class A {
public:
    A() { num++; }
    virtual void print() { std::cout << num; }
private:
    int num = 0;
};

class B : public A {
public:
    virtual void print() { std::cout << num; }
private:
    int num = 0;
};

int main() {
    A* a = new B();
    a->print();
}
  • A. 0
  • B. 1
  • C. 3
  • D. 4

1-9 次のコードの出力は?

int main() {
    int i = 0, x = 0;
    do {
        if (i % 5 == 0) {
            std::cout << x;
            x++;
        }
        ++i;
    } while (i < 10);
    std::cout << x;
}
  • A. 01
  • B. 02
  • C. 012
  • D. 011

1-10 次のコードの出力は?

class A {
public:
    virtual void a() = 0;
    A() { std::cout << "A "; }
};

class B : public A {
public:
    B() { std::cout << "B "; }
};

int main() {
    A* a = new B();
}
  • A. A B
  • B. B A
  • C. コンパイルエラー
  • D. 上記以外

1-11 64ビットシステムにおいて、次のコードの出力は?

class No {
public:
    virtual void printf() = 0;
private:
    int* ptr;
};

int main() {
    printf("%d", (int)sizeof(No));
}
  • A. 1
  • B. 4
  • C. 8
  • D. 16

1-12 仮想記憶の基礎となる局所性原理の意味は?

  • A. コードが順次実行されること
  • B. 実行時にメモリへのアクセスが不均等であること
  • C. 変数が連続してアクセスされること
  • D. 命令の局所性

1-13 m 個のプロセスが共有する臨界資源をセマフォで保護するとき、セマフォの値の範囲は?

  • A. 1 から 1−m
  • B. 1 から m−1
  • C. 1 から −m
  • D. 1 から m

1-14 通常、プロセス制御ブロック(PCB)に含まれない情報は?

  • A. プロセス識別子
  • B. プロセス状態
  • C. I/Oデバイス状態
  • D. プロセッサ状態

1-15 動的リンクに適したメモリ管理方式は?

  • A. セグメンテーション
  • B. ページング
  • C. 可変パーティション
  • D. 固定パーティション

1-16 LRUアルゴリズムでページ置換を行うとき、ページ参照列 0,1,2,7,0,5,3,5,0,2,7,6 における置換回数は?(割当フレーム数:4)

  • A. 3
  • B. 4
  • C. 5
  • D. 6

1-17 次の操作のうち、キューを補助記憶として必要とするのは?

  • A. ハッシュテーブル検索
  • B. グラフの幅優先探索
  • C. 二分木の先行順走査
  • D. グラフの深さ優先探索

1-18 ヒープの構造はどのような木か?

  • A. 完全二分木
  • B. 満二分木
  • C. 二分探索木
  • D. 平衡二分木

1-19 赤黒木を内部実装に用いているSTLコンテナは?

  • A. vector
  • B. list
  • C. map
  • D. deque

1-20 要素数 n のハッシュテーブルにおける平均検索長は?

  • A. O(logn)
  • B. O(n)
  • C. O(n logn)
  • D. n に直接依存しない

1-21 クイックソートの2パス目の結果としてあり得ないのは?

  • A. 5,2,16,12,28,60,32,72
  • B. 2,16,5,28,12,60,32,72
  • C. 2,12,16,5,28,32,72,60
  • D. 5,2,12,28,16,32,72,60

1-22 次のコードで生成される T オブジェクトの総数は?

T b(5);
T c[6];
T& d = b;
T e = b;
T* p = new T(4);
  • A. 5
  • B. 8
  • C. 9
  • D. 12

1-23 char a[] = "abc123", char b[] = "xyz" のとき、strcat(a, b) の結果は?

  • A. abc123xyz
  • B. abc123
  • C. xyz
  • D. メモリオーバーフロー

1-24 次の列挙型で、グローバル変数 x の初期値は?

enum string {
    x1,
    x2,
    x3 = 10,
    x4,
    x5,
} x;
  • A. 5
  • B. 12
  • C. 0
  • D. 不確定値

1-25 次のコードに関する正しい記述は?

myClass::foo() {
    delete this;
}
void func() {
    myClass* a = new myClass();
    a->foo();
}
  • A. スタックオーバーフローを引き起こす
  • B. 上記のどれも正しくない
  • C. コンパイルできない
  • D. セグメンテーションフォールトを引き起こす

1-26 64ビット環境での次の構造体に関する正しい記述は?

struct T {
    char a;
    int* d;
    int b;
    int c:16;
    double e;
};
T* p;
  • A. sizeof(p) == 24
  • B. sizeof(*p) == 24
  • C. sizeof(p->a) == 1
  • D. sizeof(p->e) == 4

二、解説

1-1 配列 a[2][3] の有効なインデックスは行が [0,1]、列が [0,2]。Aは a[0][2] となり有効。Bは列インデックスが範囲外。CとDはC++の文法に反する。

1-2 関数オーバーロードは、同一関数名で引数リスト(型・数・順序)が異なることを要求する。戻り値型はオーバーロードの条件にはならない。

1-3 初期値 CY = -1。1回目のループで CY = 1 となり、!CY は false になるためループ終了。

1-4 文字列リテラルは末尾にヌル文字 \0 を含むため、"ChangYou"(8文字)+\0 で計9バイト。

1-5 二次元配列 a は「配列の配列」であり、a+i は i 行目へのポインタ、*(a+i) は i 行目の配列(=先頭要素へのポインタ)、*(a+i)+j は (i,j) 要素へのポインタ、最終的に *(*(a+i)+j) で値を取得。

1-6 ビッグエンディアンでは整数3(0x00000003)の上位2バイトは0。unionにより short b は上位2バイトを参照し0となるため、0 & 1 = 0

1-7 ポインタ経由で変数 a の値を0に書き換えているため、出力は0。

1-8 派生クラス B は独自の num メンバを持つ。基底クラスのコンストラクタで A::num は1になるが、B::print()B::num(初期値0)を出力。

1-9 i=0i=5 で条件成立し、それぞれ x=0x=1 を出力。ループ終了後に x=2 を出力 → 「012」。

1-10 B が純粋仮想関数 a() を実装していないため抽象クラスとなり、インスタンス化不可 → コンパイルエラー。

1-11 抽象クラスでもvptr(8バイト)と int*(8バイト)の合計16バイト(アライメント考慮)。

1-12 局所性原理は「プログラムが特定のメモリ領域を集中してアクセスする傾向」を指し、これは仮想記憶の有効性の根拠となる。

1-13 相互排他のセマフォ初期値は1。最大(m-1)個のプロセスが待機状態になるため、最小値は1-(m-1)=2-mではなく1-m(例:m=2なら範囲[1,0,-1]→1から1-2=-1)。

1-14 I/Oデバイス状態はデバイス管理モジュールが保持し、PCBには含まれない。

1-15 セグメンテーションは論理的なプログラム単位(関数・データなど)で分割され、動的リンクに適している。

1-16 LRUで4フレーム使用時、ページ欠落9回のうち最初の4回は置換なし、残り5回が置換発生 → 答えは5。

1-17 幅優先探索(BFS)はキューを用いてノードを階層ごとに処理する。

1-18 ヒープは完全二分木の性質を持つ(最後のレベル以外は完全に埋まり、最後のレベルは左詰め)。

1-19 std::map は赤黒木を内部実装に用いることで、O(log n) の操作を保証する。

1-20 ハッシュテーブルの平均検索長は負荷率や衝突解決法に依存し、要素数nに直接比例しない。

1-21 クイックソートの各パスでは、ピボットより左はすべて≤、右はすべて≥となる。Dの並びはこの条件を満たさない可能性がある。

1-22 オブジェクト生成数:b(1) + c[6](6) + e(1) + new(1) = 9。参照は新規オブジェクトを作らない。

1-23 a は7バイト("abc123\0")しか確保されておらず、"xyz"を追加すると9バイト必要 → バッファオーバーフロー。

1-24 グローバル変数はゼロ初期化されるため、未代入の列挙子 x は0。

1-25 delete this 自体は合法。ただし、その後ポインタを使用すると未定義動作だが、このコードでは使用していないため、実行時エラーは発生しない。コンパイルも可能。よって「どれも正しくない」。

1-26 ポインタ p のサイズは8バイト(64ビット)。構造体 T のサイズはアライメントにより24以上。メンバー a はchar型なので1バイト、e はdoubleで8バイト。したがってCのみ正しい。

タグ: C++ STL メモリ管理 オペレーティングシステム データ構造

5月20日 20:12 投稿