C言語の基礎
C言語の整数型の大きさと固定幅の整数型、整数拡張と符号付き・符号なしの変換、演算子の優先順位、ビット演算、switch文、値渡しとポインタ、static変数、配列とポインタの演算、文字列とsizeof、const、関数ポインタ、malloc・freeとメモリリーク、ダングリングポインタ、バッファオーバーフロー、構造体のパディング、共用体とエンディアン、ビットフィールド、マクロと条件付きコンパイル、volatile、未定義動作を、短いコードをたどる3択問題で学べます。
C言語の基礎の要点
C言語は、OSやデバイスドライバ、マイコンのファームウェアなど、ハードウェアに近いソフトウェアで今も広く使われています。メモリの番地を直接扱えて速いコードを書ける一方で、int の大きさが処理系によって違ったり、計算の途中で型が変わったり、配列の範囲を超えても止まらなかったりと、知らないと誤りに気づきにくい決まりが多くあります。
ここでは、短いコードを実際に実行したときの出力をたどる問題を中心に、整数型の大きさと stdint.h の固定幅の整数型、整数の除算、整数拡張と符号付き・符号なしの比較、演算子の優先順位、ビット演算、短絡評価、switch 文のフォールスルー、値渡しとポインタ渡し、static 変数と寿命、ポインタの演算と配列、2次元配列の並び、文字列と strlen・sizeof、const の付け方、関数ポインタを学びます。続いて、malloc と free、メモリリーク、ダングリングポインタ、バッファオーバーフロー、NULL ポインタ、構造体のパディング、共用体とエンディアン、ビットフィールド、マクロとインクルードガード、条件付きコンパイル、組込みでの volatile、未定義動作とコンパイラの最適化を扱います。プログラムの出力は、x86-64 の Linux の gcc で実際にコンパイルして確かめています。擬似言語のトレースは「プログラミングの基礎(擬似言語のトレース)」、volatile を使った割り込みやレジスタの操作は「組込み・ファームウェア」、コンパイラの最適化の詳細は「コンパイラ」、メモリの配置やリンクは「リンカ・ローダと実行形式」の分野で扱います。
C言語の基礎の問題一覧(40問)
- C言語の規格で、int型の大きさについて定められていることとして、正しいものはどれか。
- 組込みのプログラムで、32ビットの周辺レジスタの値を入れる変数を、unsigned int ではなく stdint.h の uint32_t で宣言することが多い。主な理由として正しいものはどれか。
- 整数どうしの割り算を含む上のコードを実行したときの出力として、正しいものはどれか。
- 前置と後置の ++ を使った上のコードを実行したときの出力として、正しいものはどれか。
- if 文の条件に = を書いた上のコードを実行したときの出力として、正しいものはどれか。
- レジスタの値 reg のビット2が1かどうかを調べるつもりで、上のコードを書いた。実行したときの結果として、正しいものはどれか。
- uint8_t は8ビットの符号なし整数型である。上のコードを実行したときの出力として、正しいものはどれか。
- uint8_t は8ビットの符号なし整数型である。x を10回増やす上のコードを実行したときの出力として、正しいものはどれか。
- unsigned char は8ビット、int は32ビットとする。上のコードを実行したときの出力として、正しいものはどれか。
- uint8_t は8ビットの符号なし整数型、int は32ビットとする。上のコードを実行したときの結果として、正しいものはどれか。
- int と unsigned int は32ビットとする。上のコードを実行したときの結果として、正しいものはどれか。
- unsigned int は32ビットとする。上のコードを実行したときの動作として、正しいものはどれか。
- 「char c = 200;」とした c を printf の %d で表示するプログラムを、x86-64 の Linux 向けの gcc でコンパイルして実行すると −56、Arm の Linux 向けの gcc では 200 と表示された。違いが生じる理由として正しいものはどれか。
- && と || の右側に b++ を書いた上のコードを実行したときの出力として、正しいものはどれか。
- break のない case を含む上の switch 文を実行したときの出力として、正しいものはどれか。
- 上のプログラムを実行したときの出力として、正しいものはどれか。
- 上の関数 f を3回続けて呼び出したとき、3回目の戻り値として正しいものはどれか。
- C言語で、(1) 関数の中で static を付けずに宣言した局所変数、(2) malloc で確保した領域、(3) 関数の外で宣言した変数、のそれぞれが存在する期間(寿命)の組み合わせとして正しいものはどれか。
- int は32ビット(最大値 2147483647)とする。上の関数 fact(n) が、n の階乗をオーバーフローを起こさずに正しく返す最大の n はどれか。
- int は4バイト、ポインタは8バイトとする。int 型へのポインタ p の値(番地)が 0x1000 のとき、p + 3 の値はどれか。
- int は4バイト、ポインタは8バイトとする。上のプログラムを実行したときの出力として、正しいものはどれか。
- int は4バイトとする。上のコードを実行したときの出力として、正しいものはどれか。
- 文字列を入れた char の配列について、上のコードを実行したときの出力として、正しいものはどれか。
- 上の宣言の後に、ア「p = t;」、イ「*p = 'x';」、ウ「q = t;」、エ「*q = 'x';」のどれかを書く。コンパイルエラーになるものの組み合わせはどれか。
- 関数ポインタの配列を使った上のプログラムを実行したときの出力として、正しいものはどれか。
- fill と use は別に定義された関数とする。上の関数の問題点として、正しいものはどれか。
- 上の関数 make が返すポインタについて、正しいものはどれか。
- C言語で free(p); の直後に p = NULL; と書くことが勧められる理由として、最も適切なものはどれか。
- 上の関数 save に、8文字の文字列 "ABCDEFGH" を渡した。起こることとして正しいものはどれか。
- C言語で NULL ポインタを参照した(p が NULL のときに *p を読んだ)ときの説明として、正しいものはどれか。
- char は1バイト、int は4バイトで、int を4の倍数の番地にそろえて置く一般的な環境とする。上のコードを実行したときの出力として、正しいものはどれか。
- uint32_t は32ビット、uint8_t は8ビットの符号なし整数型で、リトルエンディアンの環境とする。上のコードを実行したときの出力として、正しいものはどれか。
- 3ビットのビットフィールドに9を入れる上のコードを実行したときの出力として、正しいものはどれか。
- #define で定義したマクロ SQUARE を使う上のコードを実行したときの出力として、正しいものはどれか。
- ヘッダファイル sensor.h を上のように書いた。#ifndef、#define、#endif の3行の目的として、正しいものはどれか。
- 上のコードを main 関数の中に書いて実行したときの出力として、正しいものはどれか。
- マイコンの出力レジスタを、上のように宣言して使っている。この宣言についての説明として、正しいものはどれか。
- C言語の規格でいう未定義動作の説明として、正しいものはどれか。
- int と unsigned int は32ビットとする。次のうち、C言語の規格で未定義動作になるものはどれか。
- 上の関数を gcc で最適化を有効にしてコンパイルすると、if (p == NULL) の判定が削除されることがある。その理由として正しいものはどれか。
C言語の基礎の参考書を探す PR
Amazonの検索結果へのリンクです。Amazonのアソシエイトとして、半導体教室は適格販売により収入を得ています。
コンピュータシステムのほかの分野
- 計算機算術 IEEE 754・固定小数点・丸め誤差
- 確率・統計と待ち行列 場合の数・確率分布・推定と検定・M/M/1
- 命令セット・アセンブリ RISC-V・アドレッシング・呼び出し規約
- コンパイラ 構文解析・SSA・最適化・レジスタ割り当て
- リンカ・ローダと実行形式 ELF・シンボル解決・再配置・動的リンク
- OSとハードウェア 割り込み・システムコール・ページフォールト
- Linuxとコマンドラインの基礎 シェル・パーミッション・パイプ・スクリプト
- メモリ階層と性能 キャッシュ・置き換え方式・ミスの3分類
- マルチコアと同期 MESI・アトミック命令・メモリバリア
- GPUプログラミング ワープ・共有メモリ・合体アクセス・占有率
- AIハードウェアとソフトウェアスタック 推論と学習・量子化・Rooflineモデル
- 機械学習の基礎 学習の種類・評価指標・ニューラルネットワーク
- 組込み・ファームウェア GPIO・UART/SPI/I2C・RTOS
- ハードウェア記述言語と検証 Verilog・ラッチ・状態機械・テストベンチ
- インターフェース・バス規格 PCIe・USB・SerDes・CXL
- ネットワークの基礎 TCP/IP・サブネット計算・DNS・TLS
- Web技術の基礎 HTTP・Cookie・REST・CORS・キャッシュ
- 無線通信の基礎 変調・OFDM・MIMO・RF回路
- 情報セキュリティの基礎 暗号・認証・Web攻撃と対策
- データベースの基礎 SQL・正規化・トランザクション
- データ構造とアルゴリズム 計算量・探索・ソート・グラフ
- プログラミングの基礎(擬似言語のトレース) 擬似言語・トレース・配列・再帰
- ソフトウェア開発とプロジェクト管理 開発プロセス・テスト・日程とコストの管理
- 経営戦略と会計の基礎(ストラテジ系) 会計・損益分岐点・経営戦略・マーケティング
- サービスマネジメントとシステム監査 SLA・インシデントと問題・監査と内部統制
- システム構成と信頼性設計 冗長化・RAID・バックアップ・クラウド
- クラウドとコンテナの基礎 Docker・Kubernetes・責任共有モデル・IaC
- 性能評価・プロファイリング アムダールの法則・CPI・ボトルネック
- ハードウェアセキュリティ サイドチャネル・セキュアブート・TEE・PUF
- 電力管理(ソフトウェア制御) DVFS・パワーゲーティング・スリープ状態