結論:C言語は「メモリを自分で管理する手続き型言語」、C++は「Cの機能を土台にクラス・テンプレート・標準ライブラリなどを足した多機能な言語」です。初心者が最短でつまずかずに進みたいなら、C言語で変数・ポインタ・メモリの基礎を先に固め、そのあとC++でオブジェクト指向やモダンな書き方に進むのがおすすめです。
C言語とC++は何が違うのか
C++はもともと「C with Classes」という名前で生まれた言語で、C言語にクラス(オブジェクト指向)・テンプレート(ジェネリックプログラミング)・例外処理・豊富な標準ライブラリを足したものです。C言語のコードの多くはほぼそのままC++としてもコンパイルできるくらい、文法的な地続き感があります。
大きな違いを表にすると次のようになります。
| 観点 | C言語 | C++ |
|---|---|---|
| パラダイム | 手続き型(関数中心) | 手続き型+オブジェクト指向+ジェネリック |
| メモリ管理 | malloc/freeを自分で呼ぶ | new/deleteに加え、スマートポインタで自動化できる |
| 文字列 | char配列を自分で操作 | std::stringで長さ管理やコピーが楽 |
| 可変長配列 | 自分でmalloc/reallocして実装 | std::vectorが標準で用意されている |
| データのまとめ方 | struct(データのみ) | struct/classにメンバ関数・継承・多態を持たせられる |
| 用途の例 | OS・組み込み・低レイヤーの学習 | ゲームエンジン・高性能アプリ・競技プログラミング |
このサイトでは、C言語の基礎から中身のしくみまでを C言語コース で、C++の文法からモダンな書き方までを C++コース で、それぞれブラウザ上でそのままコードを実行しながら学べます(無料・登録不要・環境構築なし)。どちらも実際に手を動かして違いを体感するのが一番早い理解の近道です。
具体的に何が変わるのか ― メモリ管理とデータのまとめ方
一番わかりやすい違いは「メモリの管理方法」と「データのまとめ方」です。
C言語では、ヒープ領域を使いたいときは自分で malloc を呼んで、使い終わったら自分で free を呼びます。これを忘れるとメモリリークになり、二重に呼ぶとダブルフリーという実行時エラーになります。この感覚は malloc/free ― ヒープから借りて、自分で返す や よくあるバグ ― リーク・ダングリング・ダブルフリー で実際にコードを動かしながら体験できます。
C++でも new/delete で同じことができますが(new / delete と RAII の考え方)、それに加えて std::unique_ptr や std::shared_ptr のようなスマートポインタを使えば、解放し忘れの心配をかなり減らせます。この考え方は std::unique_ptr ― 唯一の所有権 と shared_ptr と weak_ptr ― 共有する所有権 にまとまっています。
データのまとめ方も違います。C言語の struct は「データを入れる箱」でしかなく、関数(振る舞い)は別に書きます(struct基本 ― データをひとまとめにする型)。C++の struct/class はデータと関数(メンバ関数)を一緒に持たせられ、継承や多態(継承 ― 共通部分をまとめる、virtual ― 実行時に振る舞いを切り替える)でオブジェクト指向らしい設計ができます。この違いを体で理解しておくと、「なぜC++にはclassという概念が追加されたのか」がすっと腑に落ちます。
初心者はどっちから学ぶべきか
「C言語 C++ どっち 初心者」で迷っている人には、C言語から先に学ぶことをおすすめします。理由は次の2つです。
- C++の機能の多くはCの上に成り立っているため、Cでポインタやメモリのしくみを理解していると、C++のクラスやスマートポインタが「何を楽にしてくれているのか」を実感として理解できます。逆にC++から入ると、
std::vectorやstd::stringが便利すぎて、その裏でメモリが何をしているのか意識しないまま進んでしまいがちです。 - C言語のほうが文法要素が少なく、変数・条件分岐・ループ・関数・ポインタという核だけに集中できるため、プログラミングの土台を作るのに向いています。
すでにC++の授業や課題があって急いでいる場合は、C++コースの前半(変数・条件分岐・関数・配列あたり)から始めても構いません。C言語とC++は前半の文法がほぼ共通しているので、どちらから入っても大きく迷うことはありません。
なお、ポインタの &(アドレスを調べる)と *(中身を見る)の違いでつまずく人がとても多いポイントです。ここを住所の例えで丁寧に解説した記事を別に用意しているので、迷ったら C言語のポインタがわからない人へ|住所と中身の違いを動かして理解する も参考にしてください。
どこまでブラウザで実行できるか
このサイトの強みは、環境構築なしにブラウザだけでコードを動かせることです。
- C言語コースは、Hello, World から始まり、条件分岐・ループ・関数・配列・ポインタ・構造体・ファイル入出力・ビット演算まで、ほぼ全レッスンがその場で実行できます(読み物は「スタックとヒープ」の解説回と最後のまとめの2つだけ)。
- C++コースは、Hello World から始まる基礎文法に加え、
std::string・std::vector・クラス・継承・テンプレート・スマートポインタまで、本物のコンパイラ相当のエンジンでほぼ全71レッスンを実行できます。読み物として整理されているのは「スタックとヒープ」の解説回、例外処理の2回、最後のまとめのみです。
つまり両コースとも、文法を読むだけでなくその場でコードを書き換えて挙動を確かめながら学習を進められます。
つまずきやすいところ
C言語・C++に共通して初心者がつまずきやすいのが、コンパイルエラーとセグメンテーションフォールト(Segmentation fault)です。
- C言語側でよく出るエラーは、宣言忘れの
implicit declaration of functionや、printfの書式指定子と型のズレ、mallocし忘れ・freeのし忘れによるメモリリークなどです。実際のエラーメッセージと直し方は C言語のエラー にまとめています。 - C++側では、
'cout' was not declared(using/includeの漏れ)や、std::vector::at()の範囲外アクセスによるout_of_range、コピーできない型をコピーしようとしたuse of deleted functionなどがよく出ます。こちらは C++のエラー を参照してください。
エラーメッセージが出たら焦らず、まず「エラー逆引き」のページで同じ文言を探してみるのが解決の近道です。
次に読む
- C言語コース ― 変数・ポインタ・構造体・メモリ管理の基礎をブラウザで実行しながら学ぶ
- C++コース ― Cの続きからクラス・テンプレート・スマートポインタなどモダンな書き方まで学ぶ
- C言語のポインタがわからない人へ ―
&と*のつまずきを住所の例えで解説 - C言語のエラー / C++のエラー ― よくあるエラーメッセージと直し方の逆引き