C言語の基礎

C言語の整数型の大きさと固定幅の整数型、整数拡張と符号付き・符号なしの変換、演算子の優先順位、ビット演算、switch文、値渡しとポインタ、static変数、配列とポインタの演算、文字列とsizeof、const、関数ポインタ、malloc・freeとメモリリーク、ダングリングポインタ、バッファオーバーフロー、構造体のパディング、共用体とエンディアン、ビットフィールド、マクロと条件付きコンパイル、volatile、未定義動作を、短いコードをたどる3択問題で学べます。

10問練習するこの分野からランダムに10問・約5分 この分野を解くこの分野の問題をすべて、ランダムな順で出題します 苦手問題直近で間違えた問題だけを解き直します

C言語の基礎の要点

C言語は、OSやデバイスドライバ、マイコンのファームウェアなど、ハードウェアに近いソフトウェアで今も広く使われています。メモリの番地を直接扱えて速いコードを書ける一方で、int の大きさが処理系によって違ったり、計算の途中で型が変わったり、配列の範囲を超えても止まらなかったりと、知らないと誤りに気づきにくい決まりが多くあります。

ここでは、短いコードを実際に実行したときの出力をたどる問題を中心に、整数型の大きさと stdint.h の固定幅の整数型、整数の除算、整数拡張と符号付き・符号なしの比較、演算子の優先順位、ビット演算、短絡評価、switch 文のフォールスルー、値渡しとポインタ渡し、static 変数と寿命、ポインタの演算と配列、2次元配列の並び、文字列と strlen・sizeof、const の付け方、関数ポインタを学びます。続いて、malloc と free、メモリリーク、ダングリングポインタ、バッファオーバーフロー、NULL ポインタ、構造体のパディング、共用体とエンディアン、ビットフィールド、マクロとインクルードガード、条件付きコンパイル、組込みでの volatile、未定義動作とコンパイラの最適化を扱います。プログラムの出力は、x86-64 の Linux の gcc で実際にコンパイルして確かめています。擬似言語のトレースは「プログラミングの基礎(擬似言語のトレース)」、volatile を使った割り込みやレジスタの操作は「組込み・ファームウェア」、コンパイラの最適化の詳細は「コンパイラ」、メモリの配置やリンクは「リンカ・ローダと実行形式」の分野で扱います。

C言語の基礎の問題一覧(40問)

  1. C言語の規格で、int型の大きさについて定められていることとして、正しいものはどれか。
  2. 組込みのプログラムで、32ビットの周辺レジスタの値を入れる変数を、unsigned int ではなく stdint.h の uint32_t で宣言することが多い。主な理由として正しいものはどれか。
  3. 整数どうしの割り算を含む上のコードを実行したときの出力として、正しいものはどれか。
  4. 前置と後置の ++ を使った上のコードを実行したときの出力として、正しいものはどれか。
  5. if 文の条件に = を書いた上のコードを実行したときの出力として、正しいものはどれか。
  6. レジスタの値 reg のビット2が1かどうかを調べるつもりで、上のコードを書いた。実行したときの結果として、正しいものはどれか。
  7. uint8_t は8ビットの符号なし整数型である。上のコードを実行したときの出力として、正しいものはどれか。
  8. uint8_t は8ビットの符号なし整数型である。x を10回増やす上のコードを実行したときの出力として、正しいものはどれか。
  9. unsigned char は8ビット、int は32ビットとする。上のコードを実行したときの出力として、正しいものはどれか。
  10. uint8_t は8ビットの符号なし整数型、int は32ビットとする。上のコードを実行したときの結果として、正しいものはどれか。
  11. int と unsigned int は32ビットとする。上のコードを実行したときの結果として、正しいものはどれか。
  12. unsigned int は32ビットとする。上のコードを実行したときの動作として、正しいものはどれか。
  13. 「char c = 200;」とした c を printf の %d で表示するプログラムを、x86-64 の Linux 向けの gcc でコンパイルして実行すると −56、Arm の Linux 向けの gcc では 200 と表示された。違いが生じる理由として正しいものはどれか。
  14. && と || の右側に b++ を書いた上のコードを実行したときの出力として、正しいものはどれか。
  15. break のない case を含む上の switch 文を実行したときの出力として、正しいものはどれか。
  16. 上のプログラムを実行したときの出力として、正しいものはどれか。
  17. 上の関数 f を3回続けて呼び出したとき、3回目の戻り値として正しいものはどれか。
  18. C言語で、(1) 関数の中で static を付けずに宣言した局所変数、(2) malloc で確保した領域、(3) 関数の外で宣言した変数、のそれぞれが存在する期間(寿命)の組み合わせとして正しいものはどれか。
  19. int は32ビット(最大値 2147483647)とする。上の関数 fact(n) が、n の階乗をオーバーフローを起こさずに正しく返す最大の n はどれか。
  20. int は4バイト、ポインタは8バイトとする。int 型へのポインタ p の値(番地)が 0x1000 のとき、p + 3 の値はどれか。
  21. int は4バイト、ポインタは8バイトとする。上のプログラムを実行したときの出力として、正しいものはどれか。
  22. int は4バイトとする。上のコードを実行したときの出力として、正しいものはどれか。
  23. 文字列を入れた char の配列について、上のコードを実行したときの出力として、正しいものはどれか。
  24. 上の宣言の後に、ア「p = t;」、イ「*p = 'x';」、ウ「q = t;」、エ「*q = 'x';」のどれかを書く。コンパイルエラーになるものの組み合わせはどれか。
  25. 関数ポインタの配列を使った上のプログラムを実行したときの出力として、正しいものはどれか。
  26. fill と use は別に定義された関数とする。上の関数の問題点として、正しいものはどれか。
  27. 上の関数 make が返すポインタについて、正しいものはどれか。
  28. C言語で free(p); の直後に p = NULL; と書くことが勧められる理由として、最も適切なものはどれか。
  29. 上の関数 save に、8文字の文字列 "ABCDEFGH" を渡した。起こることとして正しいものはどれか。
  30. C言語で NULL ポインタを参照した(p が NULL のときに *p を読んだ)ときの説明として、正しいものはどれか。
  31. char は1バイト、int は4バイトで、int を4の倍数の番地にそろえて置く一般的な環境とする。上のコードを実行したときの出力として、正しいものはどれか。
  32. uint32_t は32ビット、uint8_t は8ビットの符号なし整数型で、リトルエンディアンの環境とする。上のコードを実行したときの出力として、正しいものはどれか。
  33. 3ビットのビットフィールドに9を入れる上のコードを実行したときの出力として、正しいものはどれか。
  34. #define で定義したマクロ SQUARE を使う上のコードを実行したときの出力として、正しいものはどれか。
  35. ヘッダファイル sensor.h を上のように書いた。#ifndef、#define、#endif の3行の目的として、正しいものはどれか。
  36. 上のコードを main 関数の中に書いて実行したときの出力として、正しいものはどれか。
  37. マイコンの出力レジスタを、上のように宣言して使っている。この宣言についての説明として、正しいものはどれか。
  38. C言語の規格でいう未定義動作の説明として、正しいものはどれか。
  39. int と unsigned int は32ビットとする。次のうち、C言語の規格で未定義動作になるものはどれか。
  40. 上の関数を gcc で最適化を有効にしてコンパイルすると、if (p == NULL) の判定が削除されることがある。その理由として正しいものはどれか。

C言語の基礎の参考書を探す PR

Amazonの検索結果へのリンクです。Amazonのアソシエイトとして、半導体教室は適格販売により収入を得ています。

コンピュータシステムのほかの分野