C/C++ の勉強に参考にしたサイトまとめ【備忘録】

約4年前に C++ に出会ってプログラミングに魅了された、現在学部1年の学生です。その当時に勉強するのにお世話になったサイトを中心に、個人的に参考にしたサイト、記事をまとめていきます。忘れているサイトも多いので、随時追加する予定です。

# C/C++

ここでは、特に明示しない限り、C と C++ で厳密に分けずに紹介していきます。特にどちらかに限定するものは、その旨を明示するようにします。

## 初心者向け

C または C++ の全容を、比較的大まかに、比較的分かりやすい順番に説明しているものです。理解するのに易しいものというわけではありませんが、悪しからず。理解が難しければ、それはこの言語自体が難しいのです。

しかし、決して習得を諦めないでほしいです。あなたはその難しい言語をせっかく習得しようとしているのですから。C/C++ はプログラミング言語（狭く言えば、高級言語）の基礎であり、この C/C++ を学んだプログラマは絶対に強いと私は思っております。この言語に限りませんが、一つの言語を一通り学んで、いくらか実装経験（実務に限らず、望む動作を書いて実行してみる経験）を積めば、世のシステムやゲームがどのように実装されているのかが想像つくようになり、例えば、ゲームのバグの起こし方やその仕組みが予想できるようになったりします。外国語を習得すると見える世界が広がるように、プログラミングを学ぶと理解できる世界が一つ増えるわけです。

一般的に、勉強などにおいて、インプットだけでなくアウトプットも大事だと言われますが、プログラミングにおいては、圧倒的にアウトプットが重要になります。一通り学んだつもりでも、実際に書いてみると手が止まってしまう、なんてことはざらにあります。プログラミング言語は、それを学ぶことが目的なのではなく、あくまで欲しい機能を実装して動かすための手段なのですから、実際に使いこなす力こそが必要なわけです。外国語の文法や単語をたくさん覚えて満足しても、それだけでは実際の会話で使えるわけではないのと同じように、アウトプットを繰り返して運用能力を身につける必要があるのです。
もちろん、インプットが必要ないという意味ではありません。他人のコードを見ることで、自分が知らなかった、思いつかなかった書き方を知ることも大事です。また、実装が上手くいかないときは、どうしたら上手く動いてくれるのか、どうしたら欲しい機能を実装できるのかを、その都度調べながら書いていくことになります。そういう意味では、検索能力もプログラマに必要な能力の一つといえるでしょう。

…少々長くなりました。プログラミングを学び始めると、コードの書き方以外にも、学ばなければならない、たくさんのことに出会うことになるでしょう。一度に覚えることは不可能ですが、やっているうちに分かるようになることもあります。根気よく学んでいきましょう。

### 一週間で身につくC言語の基本

http://c-lang.sevendays-study.com/index.html

タイトル通り、C に限定するものです。一週間で身につけることができる…かどうかは分かりませんが、比較的学びやすい順番とボリュームになっていると思います。記憶が正しければ、私はこのサイトで本格的に学び始めました。

基本編と応用編に分かれていますが、基本編のほうから順番に学びましょう。基本編とはいえ易しいというわけでもないので、ひとつひとつ理解しながら一度に習得しようとするよりは、一旦一読して全容をなんとなく掴んでから、適宜理解していないところに戻ったり、分からない用語を検索したりして進めていくことをおすすめします。
応用編も同様に進めてほしいですが、より深い内容になっており、特にポインタ周りはかなり理解が難しいので、完璧な理解は一度諦めるのも手です。しかし大事な要素でもありますから、他を一通り理解した後でもいいので、他のサイトなども参考にしながら、根気よく学んでほしいです。（ただし脅しにはなりますが、下手なことをするとパソコンを壊してしまうことも可能なので、ポインタ周りは少々慎重に実装してくださいね）

:::note warn

**注意:** (2024/08/14 追記)

このサイト内で紹介されている全てのソースコードで、`main()` 関数の型が `void` になっていますが、単刀直入に言うとこれは不適切で、`int` で定義するのが適切だと言えます。C のコンパイラに `void` での宣言を許容するものが一部あるようですが、あくまで `int` での宣言が正式であり、`void` での宣言は実装依存となってしまうので避けるようにしましょう。なお、C++ では `int` 以外は許容されていないので、その意味でも `int` が適切でしょう。

(@fujitanozomu 様からご指摘頂いたので、補足させていただきました。ありがとうございますm(__)m)

参考: 
* https://qiita.com/yohhoy/items/b45defce0716638ad03a
* https://qiita.com/raccy/items/b59bd7fa9f4eacabca79

:::

### 一週間で身につくC++言語の基本

https://cpp-lang.sevendays-study.com/index.html

ほとんど C++ に限定するものです。サイト内にもリンクがありますが、前述の[一週間で身につくC言語の基本](http://c-lang.sevendays-study.com/index.html)を学んだことを前提にした構成になっているので、特に C を学んだことがない方は、絶対にそちらから学ぶようにしてください。進め方については、前述と同様です。

### かいてい.net (2024/08/13 追記)

http://kaitei.net/

C、C++、さらに C# についてもまとめられています。比較的学びやすい順番で十分詳しくまとめられていると思われます。ボリュームは前述の「一週間で身につく～」シリーズより多めで、こちらのほうが章立てが分かりやすく、サイトの見た目もすっきりしている印象です。

### ゼロから学ぶ C++ (2024/08/13 追記)

https://rinatz.github.io/cpp-book/

サイト内にも記述がありますが、プログラム言語を一つ以上経験したことのある方を対象にしていて、C++ から学ぼうとしている初学者には詳しすぎるので、そういった方にはおすすめできません。ただ、学ぶ順番やボリュームなどの観点から、学習サイトとして質が高いと判断したので、初心者向けとして紹介いたしました。前述のサイトで一通り学んだあとに読んでみるのも良いかもしれません。他のサイトを見てみたら分からなかったところが分かった、なんてこともあるので、混乱しない程度に複数のサイトを参考にするのも良いでしょう。

## 中級者～上級者向け

言語仕様、全ての実行文の意味を厳密に理解したい方向け。

### ハローワールド徹底解説 #C++ - Qiita

https://qiita.com/kazatsuyu/items/478c55de0f75ea5904bd

タイトル通り、サンプルコードとしてよく出会う、標準出力に "Hello, World!" を出力する C++ のソースコードを題材として、関連した仕様まで細かく解説している記事です。正直、私が十分理解してない部分もあります。マクロや、ポインタ、リテラルなど、多くの要素に深く触れているので、ボリューム満点です。根気よく学びましょう。

## C/C++ に限らないもの (2024/08/13 追記)

C/C++ に限らず、プログラミングなどを学んだり、開発する上で役立つサイト等を紹介していきます。

### Qiita

https://qiita.com/

このサイトですね。技術記事がたくさん投稿されているので、プログラミング等で困ったときは、Qiita で検索すれば大抵は答えが見つかるはすです。私は検索結果に Qiita の記事があるときは、優先的に見るようにしています。

### 「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典 (2024/08/13 分類変更)

https://wa3.i-3-i.info/index.html

主に初学者に向けて、IT用語をざっくりと説明しているものです。C/C++ に限らず、プログラミングを学ぼうとすると、知らない用語にたくさん出会うことになります。そういったときに非常にお世話になったサイトです。特に概念などは小難しい文章で説明されても頭に入りませんから。こちらのサイトで「分かった」気になってからそういった説明に戻ると、案外スルッと頭に入ったりするんです。検索結果にこちらのサイトを含めたい場合は、検索ワードに "piyopiyo" または "piyo" を加えるとヒットします。

ちなみに、この記事をまとめながらこちらのサイトで "[C++](https://wa3.i-3-i.info/word12700.html)" をふと検索してみたら、C++ の名前の "++" の由来は、C を一つ進めた、インクリメントしたという意味で、インクリメント演算子の "++" を意図したもの、らしいです。真偽のほどは少し微妙ですが、恐らく合っていると思われます。
さらにちなむと、後に開発された C# の "#" は、さらに "++" を重ねて、4つの "+" を合わせて "#" となったみたいです。面白いですね。

# その他、C/C++ に関して

以上で C/C++ 言語の勉強に役立つであろうサイト等を紹介しましたが、C/C++ を学ぶ上で必要になること、ものなどを、主に初学者向けに紹介していきます。ぜひ参考にしてください。

## コードエディタ（テキストエディタ）

コードを書くには、例えば Windows 標準の「メモ帳」でも可能ではありますが、もっと書きやすい機能を持ったソフトがたくさんあります。そういったソフトを、コードエディタとかテキストエディタなどと呼びます。

### Visual Studio Code (VSCode)

https://code.visualstudio.com/

一番おすすめしたいエディタです。ブラウザ版もありますが、インストールして使いましょう。拡張機能が豊富で、色んなプログラミング言語に対応可能です。ただし、C/C++ の実行環境の構築は少し難しくなるので、簡単に実行もコーディングも一つのソフトで完結させたいなら、後述の Visual Studio がおすすめです。私の場合は VSCode で実行環境を作るのに挫折したので、実行だけ Visual Studio を使っていました…。~~環境構築については、後日やり方等含めて追記するかもしれません。~~（2024/08/13 追記しました）

### Visual Studio

https://visualstudio.microsoft.com/ja/

実行環境の構築に奮闘することなく使えるエディタです。ただ、好みもあるとは思いますが、エディタとしては VSCode と比べると使いづらい印象です。Windows にしか対応してないようなのでそこも注意です。

## 実行環境構築 (2024/08/13 追記)

一般に、コードは書いただけでは動かすことができません。動かすためには書いたコードを実行できる形に変換しなければならないので、その変換を行うプログラムであるコンパイラなどをインストールし、開発しやすい環境を整える必要があります。（かなりざっくりとした説明なので、詳しくは コンパイル とか インタプリタとの違い とかで検索してみてください）

### VSCode での C/C++ の実行環境構築 (Windows)

https://qiita.com/ochx/items/01449d09777187790ee4

Windows での方法になります。最近ようやくこれで実行環境作れました。あくまで一例ではありますが、個人的にはこれが一番導入しやすいかなと思います。

# まとめ

以上、C/C++ の勉強に参考にしたサイトや記事、その他関連するものなど紹介しました。少々プログラミングに対する気持ちが漏れ出てしまった気もしますが、プログラミングを、C/C++ を学ぶきっかけに、挫折しても乗り越えていく力になったなら幸いです。また気が向けば、ポインタの話や、命名規則やマジックナンバーなどの言語に限らないことも追加でまとめてみようかと思います。また、記述に間違い等あればご指摘願います。