本文へスキップ
BecomeCoder

C言語コース · 第13章 まとめ・実践 · レッスン50

C言語のまとめ ― C99/C11とC++との違い

ローカル実施

導入

このコースでは、printf による出力から始めて、変数と型、制御構文、関数配列、ポインタ、文字列、構造体、そして mallocfree による動的メモリ管理までを学んできました。最後に、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> をインクルードすると booltruefalse という馴染みのある名前で使えます。
  • <stdint.h> の固定幅整数型(C99) ― int のサイズは環境によって変わることがありますが、int32_tuint8_tint64_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章)classstruct+メンバ関数、カプセル化・継承
型を変えても使える処理void* や関数ポインタ、あるいは型ごとに書き直すテンプレート(template)でコンパイル時に型ごとのコードを生成
使い終わったメモリの解放free を自分で呼ぶ(呼び忘れ=リーク、二重に呼ぶ=バグデストラクタ・RAIIでスコープを抜けると自動的に解放される
エラーの伝え方戻り値やエラーコードで表現する(return -1; など)例外(throwtrycatch)で伝える
flowchart TB
  c["C言語<br/>(このコース)"] --> os["OS・組み込み機器"]
  c --> lang["多くの言語のランタイム自体"]
  c --> cpp["C++<br/>(クラス・vector・RAIIなどを追加)"]
  cpp --> app["大規模なアプリケーション開発"]

C言語に「自動化された便利さ」が少ないのは欠点ではなく、「メモリと処理の流れをすべて自分で把握できる」という強みでもあります。C++やその他の多くの言語がなぜ・どうやってメモリを管理しているかは、Cで一度手を動かしてから見ると、ずっと理解しやすくなります。

まとめ

  • printf・変数と型・制御構文・関数・配列・ポインタ・文字列・構造体・mallocfree ―― このコースで学んだ道具は、C言語だけでなく、他の多くの言語やOS・組み込みの世界を理解するための共通の土台になります。
  • C99/C11で便利な機能が追加されましたが、まずは中核の書き方を使いこなせることが何より大切です。
  • C++やその他の高級言語で「自動でやってくれる」ことの裏側で、実際に何が起きているかをCで知っているのは、大きな強みです。ポインタでつまずいた経験、mallocfreeを自分で対応させた経験は、この先どんな言語を学ぶときにも活きてきます。

お疲れさまでした。ここまでのコースで、C言語の基礎はひと通り身につきました。次はぜひ、姉妹コースのC++や、他の言語のコースで学びを広げてみてください。