はじめに
C 言語は 1972年にUSの有名なベル研究所で Dennis Ritchie らが設計・実装した言語だ。
今となっては低水準な言語だが、充分な機能、簡潔な記法とアセンブラに近いパフォーマンスを持ち、
Unix, Windows, Linux 等の OS をはじめ、コンパイラ、テキストエディタ等のツールや、ビジネスアプリやゲームなど多くの各種アプリケーション開発に用いられてきた。
C++ 言語は 1980年頃、やはりベル研究所の Bjarne Stroustrup が開発したもので、C にオブジェクト指向などの機能を追加したものだ。
C との互換性を維持しつつオブジェクト指向が可能で、パフォーマンスも高かったことから、
1990年頃から、ビジネスアプリやゲームなど多くのアプリケーション開発に使用されるようになった。
C++ は、過去の互換性を維持しつつ最先端のプログラミングパラダイムを多く取り入れてきたために、大規模で初心者には敷居が高い言語になってしまった。
しかし、全ての機能を使う必要はなく、まずは基本をマスターし、使える機能を徐々に増やしていけば、そんなに恐れることはない。
将棋プログラムなど高度なパフォーマンスを要求される分野では C/C++ 一択であり、ある程度時間を要してもマスターして後悔しない言語だ。
※ 第24回世界コンピュータ将棋選手権 参加チーム の「使用言語」を見ると分かるように、上位の成績を残すチームは全て C/C++ を使用している。
本稿の目的
本稿のシリーズ「さくさく理解する C言語/C++ プログラミング入門」は、もともとは、ニコニコ生放送で プログラミング生放送 を行っている 某氏 の教材用に 2013年の秋頃から徐々に執筆してきたものだ。
初学者は、書籍を読んで理解した気になっても、実際は理解していないことが多い。
ちゃんと演習問題を解き、理解したかどうかを明確にし、かつ記憶に残るようにしなくてはいけない。
時間が余計にかかると思うかもしれないが、確実に学習していくことが結局は早道なのだ。
無意味に先走っても、何もいいことは無い。
また、放送主が使用していた書籍は網羅的で言語の細部まで詳しく解説してあるのだが、情報が古い
(2010年頃執筆されたにもかかわらず、2000年頃のことが書いてある)こともままあった。
C++は最先端で使用され続けている言語であり、進化も速いのだ。
本シリーズは、初心者・初級者が中級者以上になれることが目的だ。
最新の仕様に対応した必須の情報に絞り、なるべく多くの演習問題を用意したつもりだ。
言語仕様の細かいところにはあまりこだわらず、これくらいは知っとけよという部分を中心に解説する。
本シリーズで言及していないC/C++ 仕様の詳細については、リファレンス的なサイトへのリンクを示しているので、そちらで勉強して欲しい。
PV数を稼ぐため 検索エンジンからやってきた人のために、やりたいことをやる方法を探す場合、
いわゆる逆引き的な使い方(コピペしてすぐ使えるコード満載)もできるように留意したつもりだ。
高度なことにはあまり触れていないが、パフォーマンスに関しては少し詳しく説明している箇所もある。
ニコニコ生放送のプログラミング放送を見ていると、プログラムが意図したように動くかどうかだけで精一杯で、
パフォーマンスのことはまったく考えていない放送主が多い。
それでは後で詰まることもままあるので、パフォーマンスは最初からある程度は考えていた方がよい
(ただし、最初から過度にパフォーマンス・チューニングするのはいろいろ危険だ)。
なので、O(N) など処理時間の話にも触れている。慣れない初級者にはちょっとむずかしい面もあるかもしれないが、
ぜひマスターして欲しいと願っている。
本シリーズは、某氏の生放送
で実際に使用してもらっており、そのフィードバックを受けて、タイプミス等の間違い修正や解りづらい箇所の加筆を行っている。
なので、それなりに間違いは少ないと思うが、完全ではない。
間違いや加筆した方がいいと思う箇所がある場合は、ツイッター(@vivisuke) 等で指摘してくださるとありがたい。
準備
C++ やさしい入門
- Hello, World
- 変数と式
- 標準入力と条件分岐
- 配列とループ
- 関数定義
文法
- C言語 C++ 演算子 入門
- C++ クラス 入門
- C言語 C++ 構造体 入門
- C言語/C++ ポインタ入門
- C言語/C++ static 修飾子 入門
- C++ const 修飾子 入門
- C++ 演算子オーバーロード 入門
データ構造+アルゴリズム
- C言語/C++ 配列の基本アルゴリズム 入門
- 再帰
- 文字列検索
- 差分検出(diff)
C++ 標準ライブラリ
- C++ 文字列クラス std::string 入門
- コンテナクラス
- C++ 動的配列クラス std::vector 入門
- C++ 固定長配列クラス std::array 入門
- C++ 両端キュー std::deque 入門
- C++ 双方向リストクラス std::list 入門
- C++ 単方向リストクラス forward_list 入門
- C++ 連想配列クラス std::map 入門
- C++ 多重連想配列クラス std::multimap 入門
- C++ ハッシュ連想配列クラス std::unordered_map 入門
- C++ 順序付集合 std::set 入門
- C++ 重複あり集合 std::multiset 入門
- イテレータ
- アルゴリズム
C++11
- C++11 範囲ベース for ループ 入門
- C++ 処理時間計測 入門 > C++11 chrono
- C++11 乱数 std::random 入門
- std::to_str() :数値を std::string 文字列に変換
- C++11 enum class 入門
- スマートポインタ
その他
コンソールゲームアプリのソースコード解説
演習問題
- ポインタ4択問題集 84問からランダムに10問出題
- ポインタ穴埋め問題集
- 基礎の基礎 演習問題
- 基礎 演習問題 全50問、解答例・テストコード付きだよ
- 文字コード 演習問題
- ポインタへのポインタ 演習問題 執筆中
- 構造体 演習問題 執筆中 解答例をとりあえず記述しました
- 動的配列クラス 演習問題 全25問、解答例・テストコード付きだよ
- 文字列クラス 演習問題 執筆中 全30問、解答例・テストコード付きだよ
- リストクラス 演習問題 執筆中
参考
以下は筆者がよく利用するサイト
余談
筆者が初めて C++ に出会ったのは1992年の初めだ。
当時は、今はなき Lotus Development(現IBM)に勤務しており、
US のアトランタ支社(Ami Word というワープロソフトを開発していた会社を Lotus が買収した)に出張し、ワープロの日本語化作業を行っていた時だ。
そのワープロソフトは C で記述されていたのだが、次の版では C++ に切り替えようということで、
開発部署で ボーランドC++ を大量に買い込んだ。
で、それが余っていたので、筆者もそれを貰って触り始めたのが、C++ との出会いだ。
ただ、C++ を全然わかってなかったので、アトランタにいた時は C++ コンパイラを C としてしか使用していなかったと思う。
(日本語化作業を行っていたワープロは C で記述されてた。)
しばらくして日本に帰国し、ちゃんと勉強しようと思い買ったのが、
工藤 智行 (著):「Cユーザのための C++入門〈基礎編〉 」だ。
この本は C をマスターしている人向けに C++ の基礎を解説したもので、非常にわかりやすく、この本のおかげで C++ が一応使えるようになったと思う。
余談
今はなき Lotus Development(現IBM)に就職したのは、1991年12月初めだ。 出社すると当時の上司のK氏に「来週月曜日からアトランタに年末まで出張だ」と告げられた。「えーっ、英会話できませんよ」というと、 「津田くんは C 言語がしゃべれるから大丈夫」と、太鼓判を押されてしまった。
英語での日常生活に困ることは無かったけど、仕事の込み入った話は困難で、かなり大丈夫じゃなかったですよ。。。
謝辞
多くの人もそうだと思うが、筆者にとっては文章を書くのはいろいろ大変で時間がかかる。構成・内容を考えないといけないし、比喩も考えないといけない。
本稿のシリーズでは演習問題も考えないといけないし、サンプル・解答例のソースコードをデバッグしないといけない。
それに、タイプミスや勘違いや修正ミスもよくあるのだが、それを自分で見つけるのはなかなか大変だ。
また、せっかく解説文章を書いても、それを誰も読んでくれないのでは、書く張り合いがなく、モチベーションが上がらない。
その点、筆者は某生主という仮想読者を見つけることが出来たのは大変ラッキーで、
某氏にはとても感謝している。
生放送によるフィードバックのおかげでタイプミスや説明が不十分な説明箇所が減り、コンテンツのクォリティがだいぶ向上したと考えている。
それに、某生主に早く解説を書けとせっつかれることもあり、モチベーションの維持にも有効だ。
某氏は情報関係が専門でも、情報関係の仕事をしているわけでもないのに、根気強く長期にわたって、筆者の文章を教材に使って生放送をしてくれている。
日本語?がなかなか通じず、イラッと来ることはままあったが、その継続力にはほんとうに頭が下がる。
彼のおかげで本シリーズがここまで出来上がったと言っても過言ではない。
また、彼の生放送にいつも来てくれて、的確なツッコミを入れたり、いろいろなアドバイスをしてくれているリスナーの方々にも感謝している。 過疎放送では盛り上がらず、生放送を続けることも出来ないからだ。
というわけで、今後もよろしくおながいします~