導入
このコースでは、printf による出力から始めて、変数と型、制御構文、関数、配列、ポインタ、文字列、構造体、そして malloc/free による動的メモリ管理までを学んできました。最後に、C言語の規格(C99/C11)で追加された代表的な機能と、姉妹コースのC++との違いを整理して、このコースを締めくくります。
説明
C99・C11で変わった主な点
このコースで扱ったのは、C言語のもともとの中核部分(K&R Cから続く書き方)です。実際には規格が更新されるたびに、便利な機能が少しずつ足されてきました。代表的なものを軽く紹介します。
//の1行コメント(C99〜) ― 昔のCでは/* ... */しかありませんでしたが、C99でC++と同じ//が標準に入りました。このコースではすでに//を使っていますが、これはC99以降の機能です。- 可変長配列(VLA)(C99) ―
int n = 5; int arr[n];のように、配列のサイズを実行時に決めた変数で指定できます(第5章の配列はint arr[5];のように固定サイズで書いてきました)。ただし対応状況の差やスタックを使う点に注意が必要で、実務では今もmallocで確保する書き方が好まれることが多いです。 _Bool型と<stdbool.h>(C99) ― Cにはもともと専用の真偽値型がなく、0を偽・0以外を真として扱っていました(第3章のifで見たとおりです)。C99で_Bool型が追加され、<stdbool.h>をインクルードするとbool・true・falseという馴染みのある名前で使えます。<stdint.h>の固定幅整数型(C99) ―intのサイズは環境によって変わることがありますが、int32_t・uint8_t・int64_tのように「ビット幅が保証された」型が使えます。組み込み機器やファイル形式など、サイズが厳密に重要な場面で使われます。_Static_assert/無名構造体・共用体(C11) ― コンパイル時に条件をチェックする_Static_assertや、構造体の中に名前のない構造体・共用体を埋め込める機能などが加わりました。
これらは「知っておくと読めるコードが増える」程度の位置づけで十分です。まずはこのコースで学んだ中核の書き方(printf/型/制御構文/関数/配列/ポインタ/構造体/malloc)を確実に使えることが、C言語を書く力の土台になります。
CとC++の違い
姉妹コースのC++では、C言語の上に「自動でメモリを管理してくれる仕組み」や「オブジェクト指向」が積み重なっています。同じことをする道具を並べてみると、違いがはっきりします。
| やりたいこと | C(このコース) | C++(C++コース) |
|---|---|---|
| 文字列を扱う | char の配列+\0(終端文字)を自分で管理 | std::string(サイズも終端も自動管理) |
| 可変長のリスト | 構造体+mallocで連結リストを自作(第8章・第13章) | std::vector(追加・削除・サイズ管理を自動でやってくれる) |
| データと処理をまとめる | 構造体+構造体を引数に取る関数(第7章) | class/struct+メンバ関数、カプセル化・継承 |
| 型を変えても使える処理 | void* や関数ポインタ、あるいは型ごとに書き直す | テンプレート(template)でコンパイル時に型ごとのコードを生成 |
| 使い終わったメモリの解放 | free を自分で呼ぶ(呼び忘れ=リーク、二重に呼ぶ=バグ) | デストラクタ・RAIIでスコープを抜けると自動的に解放される |
| エラーの伝え方 | 戻り値やエラーコードで表現する(return -1; など) | 例外(throw/try/catch)で伝える |
flowchart TB c["C言語<br/>(このコース)"] --> os["OS・組み込み機器"] c --> lang["多くの言語のランタイム自体"] c --> cpp["C++<br/>(クラス・vector・RAIIなどを追加)"] cpp --> app["大規模なアプリケーション開発"]
C言語に「自動化された便利さ」が少ないのは欠点ではなく、「メモリと処理の流れをすべて自分で把握できる」という強みでもあります。C++やその他の多くの言語がなぜ・どうやってメモリを管理しているかは、Cで一度手を動かしてから見ると、ずっと理解しやすくなります。
まとめ
printf・変数と型・制御構文・関数・配列・ポインタ・文字列・構造体・malloc/free―― このコースで学んだ道具は、C言語だけでなく、他の多くの言語やOS・組み込みの世界を理解するための共通の土台になります。- C99/C11で便利な機能が追加されましたが、まずは中核の書き方を使いこなせることが何より大切です。
- C++やその他の高級言語で「自動でやってくれる」ことの裏側で、実際に何が起きているかをCで知っているのは、大きな強みです。ポインタでつまずいた経験、
malloc・freeを自分で対応させた経験は、この先どんな言語を学ぶときにも活きてきます。
お疲れさまでした。ここまでのコースで、C言語の基礎はひと通り身につきました。次はぜひ、姉妹コースのC++や、他の言語のコースで学びを広げてみてください。