目次
はじめに
今日におけるC/C++言語
本書の読み方
コンピューターの仕組みとプログラムの役割
コンピューターの仕組み
デジタルデータは、0か1かの連続。
デジタルデータの単位、「ビット」と「バイト」
基本データ型
16進数表記
32bitシステムと、64bitシステムへの移行。
「ソースファイル」と「ヘッダファイル」
「コンパイラ」 と「リンカ」 ( 実行ファイルを作るプログラム )
VisualStudioをインストールする。
無料版をインストールしてみる。
「プロジェクト」を作成する。
プログラムを実行する。
Cの基本構文
C言語のプログラムコードをみてみよう
変数
基本データ型 ( 整数 )
基本データ型 (論理値)
基本データ型 (浮動小数点)
浮動小数点の仕組み
定数 ( const )
配列
多次元配列
ポインタ
ポインタ・ポインタ
型キャスト ( 整数 )
型キャスト ( 浮動小数点 )
型キャスト ( ポインタ型 )
マルチバイト文字 ( char )
エスケープシーケンス
文字コード
文字列の長さと言語ロケール
標準入出力 ( printf_s scanf_s )
数式と四則演算子
比較式と比較演算子
論理演算子
ビット演算子
データ型の別名定義 ( typedef )
構造体型の定義 ( struct )
不完全型の前方宣言
共用体型の定義 ( union )
列挙体型の定義 ( enum )
関数
関数の種類
「関数ポインタ」と「関数テーブル」
「グローバル変数」と「ローカル変数」
「グローバル変数」のextern宣言
「ローカル変数」のstatic宣言
ヒープメモリ領域 ( malloc free )
条件分岐 ( if else switch )
くり返し ( for while do )
ラベル移動 ( goto )
マクロ ( #define )
エラー処理 ( abort exit )
ワイド文字列の加工 (基本編)
テキストファイルを読み込む。
テキストファイルに書き込む。
「リトルエンディアン」
バイナリファイルを読み込む。
バイナリファイルへの書き込み。
その他のファイル操作
ディレクトリの操作
ヘッダファイルの書き方
インクルードガード
プリプロセッサ命令
インラインアセンブラ
スタティックライブラリ
DLL ( ダイナミックリンクライブラリ )
「DEFファイル」と「序数」
プリコンパイル済みヘッダ
C++の基本構文
C++のプログラムコードを見てみよう。
「オブジェクト指向」
「クラスの宣言」と「インスタンス化」
アクセス指定子 ( public: private: )
初期化子リスト
静的メンバ ( static )
「参照」 (別名)
配列の参照
演算子の「オーバーロード」
コピーコンストラクタ ( と explicit )
いろいろな演算子の「オーバーロード」
型キャストの「オーバーロード」
クラスの「継承」
protected アクセス指定子
「仮想関数」 ( virtual )
this ポインタ
型キャスト ( クラス型 )
「抽象クラス」 ( と、純粋仮想関数 )
関数の「オーバーロード」
コンポジションクラスと派生クラスの使い分け
「インターフェイス」 ( __interface )
DLLのクラス型を呼び出す
引数の初期値
constメソッドと「mutable」
集約クラスとコンポジットクラス
「名前空間」
例外処理 ( try catch throw )
「フレンドクラス」と「フレンド関数」 ( friend )
「テンプレート」 ( template typename )
「インライン展開」 ( inline )
ポインタと参照の使い分け
Cの関数を呼び出す ( extern "C" )
メンバ関数ポインタ
protected継承
COM
COMの仕組みを見てみよう
「BSTR」
NMAKE
コマンドラインでビルドする
奥付
奥付

閉じる


今日におけるC/C++言語

 
C言語は、メモリ直接操作する言語であり、
機械語」 (アセンブラ含む) に次いで、コンピューターに近い処理を書くため、
メモリ効率がよく、実行速度極めて高速です。
 
しかし、「Java」などの簡略化された言語と比べると、
やはり「書きにくい言語」といえます。
 
C言語が開発された当初からすれば、
パソコンの性能は飛躍的に向上しました。
 
これにともなって、プログラミング言語
実行速度」や「メモリ効率」を突き詰めて書くよりも、
書きやすさ」、つまり、「開発効率」が優先されるようになり、
最近では、「Javaや「C#」などで開発されることが多くなりました。
 
プログラマーがC言語で書く箇所は、格段に少なくなりました。
 
しかし、工業用ロボットなど組み込み
たいていC言語アセンブラで書かれていますし、
ゲームプログラミング」などでも、実行速度が重視されるため、
ネイティブなC/C++言語による開発は、いまなお主流となっています。
 
また、「C」は、オープン系のシステム開発主流となっている「Java」や
C#」、「JavaScript」など、ほとんどの言語先祖にあたり、
共通する点も多いため、その仕組みを知っておくことは、
将来的にも、たいへん意義のあることであると思います。
 
iPhoneアプリ」の開発で使う「Objective-C」という言語も、
C言語マクロ関数をつけたもので、ほとんどC言語です。
 
本書では、従来の入門書入門サイトの内容に加えて、
より実践的なプログラミングを行うにあたって欠けている点補うと共に、
気の短い方にもムリなく読んでいただけるように
単語の種類ごとに色付けを行うなど、読みやすさを追求しています。
 
サンプルコードは、テストするようにしていますが、
絶対ということは言い切れませんので、
使用するにあっては、自己責任でお願いします。
 
 

本書の読み方

 
画像表示されない時は、
 「再読み込み」をしてみて下さい。
 
ビューア上の方に、もくじがあります。 ( PDFにはありません )
 
・まだ執筆中ですので、
 修正や、抜けている点があります。
 
・まずは、一通り、読んでいただいて、
 最初は、わからない点もあると思いますが、
 実際に、書いていれば、そのうち理解できます。
 
・また本書では、読者さんの読解力計算力などを試したり、
 きたえたりするといったことは目的としておらず、
 そのような設問も、行っておりません。
 
・あくまでも、「C/C++」というコンピュータ言語の書き方について、
 基礎的な知識の理解を充実させるために、
 その助けとなるような解説を行うことに主眼をおいています。
 
・したがって、その他の学習については、他書にゆずります。
 
・たまに更新を行っていますので、ダウンロードされた方は、
 以降も、定期的にダウンロードし直すようにしてください。
 
WindowsAPIなどのライブラリ使い方は、
 続巻で取り扱う予定です。
 
 ・「STL」 ... おもによく使うコンテナクラスをラッピング。
 ・標準コントロールコモンコントロール。 ( ★執筆中。一部公開中 )
 ・「GDI」 ... 描画系の関数いろいろ。( 印刷くらいしか使い道ない? )
 ・「Direct2D」 ... グラフィックデバイスに直接書き込む2D描画ライブラリ。
 ・「WIC」 ...  「PNG」「jpeg」など、画像ファイルを簡単に読み書きするライブラリ。
 ・「Direct3D 10.1&11」 ... 3D描画ライブラリ。
 ・「DirectInput」「XInput」 ... コントローラーのライブラリ。 
 ・「MME」 ... 「MIDI」「WAV」「MP3」など、音声を扱うライブラリ。
 ・「XAudio2」 ... 「DirectSound」の後継ライブラリ。
 ・「WASAPI」 ... 「カーネルミキサー」を使わないので速い。
 ・「MSXML」 ... 「XML」の読み書きでつかうライブラリ。
 ・「SSE」「AVX2」 ... 並列処理用の組み込みライブラリ。
 
・待ちきれないという方は、
 ネットを利用するなどして、各自で勉強して下さい。
 
新しい本アップされたら、ブログお知らせします。↓
 
 

コンピューターの仕組み

 
 コンピューター仕組みをおさらいしておきましょう。
 
 
 
 
 
 「CPU」(中央処理装置)は、計算を行うところです。
 
 画面上の1ピクセルの色が変化するのも、効果音の音程が変化するのも、
  すべてCPUによる計算によるものです。( 足し算や引き算など )
 
 「メモリ」(記憶装置)は、プログラムや、計算で使うデータを、
   「ハードディスク」や「CD-ROM」から取り出して、
   一時的に置いておく「作業台」とか、「配送センター」のようなものです。
 
 私たちがこれから書いていく「プログラム」は、
   「CPU」への「命令」を箇条書きにしたもので、
   いわば「コンピューターへの作業手順書」ともいえるものです。
 

   [ CPU ] ←(計算式データ) [ メモリ ] 
 
   [ CPU ] -(解答データ) [ メモリ ] 

 
 「メモリ」は、比較的、高価な電子部品で、
    「ハードディスク」ほどの容量はないのですが、
    磁気ディスクから読み取る手間がかからないため、
    CPUデータやり取りする際のアクセス速度が高速です。
 
 CPUからすれば、CPUの内部にあるレジスタキャッシュ
  すべてのデータを置いておく方が速いんですが、
  画像のデータや音声のデータは、とても入りきらないので、
  必要なデータだけをメインメモリに読み込んでおいて、
  その中でも特に、いま行っている計算に必要なデータだけを
  レジスタに転送して計算する仕組みをとっているのです。
 
ちなみに、レジスタは、マシン語アセンブラで書くと、操作できるんですが、
  キャッシュについては、よく使うデータ自動的にストックされるので、
  プログラマが操作することはできません
 
 
 
 
 
 プログラムは、データの移動に関する処理が多く、
  倉庫管理や、配送などの仕事に通じるものがあります。
 
 よく使うデータだけを、厳選してメモリ上に用意しておくだとか、
  よく使う計算結果は、メモリ上に残しておくことで、
   データの移動回数や、計算回数少なくすることができます。
 
 データの転送が速く済めば、大量の計算を行ったとしても、
  画面が固まることが少なくなり、快適な動作を実現することができます。
 
 
 アプリケーションソフトアイコンをクリックすると、OSの「ローダー」というプログラムによって
  アプリケーションの実行ファイルメモリ上に読み込まれ、プログラム実行されます。
 
 プログラム文」というと、C言語で書かれていることが多いのですが、
  実際に、プログラムが実行された時、CPUが読み取っているのは
  マシン語の命令番号です。 ( オペコード」という )
 
 しかし、ただ、数字を並べただけだと、書いてるうちに意味がわからなくなるので、
  人間からみて、比較的読みやすいC言語でプログラム文を書いておいて、
  あらかたできたところで、それを「コンパイラ」というソフトを使って、
  マシン語に置き換えるようにしているのです。( これを 「コンパイル」 という )
 
 この時に作られるのが実行ファイルで、( 実際には、リンカというソフトによって作成される )
  アプリケーションソフトのフォルダ内にある、「ホニャララ.exe」というファイルがそれです。
 
 
 ちなみに、ハードディスクについては、最近は「SSD」という記憶装置が普及しています。
 
 これは、フラッシュメモリの一種で、ハードディスクに比べると、
   書き込み回数の制限があるものの、データの転送速度が格段に速いため、
   メインメモリの少ない非力なシステム環境絶大なパフォーマンス向上効果があり、
   おもに、ノートPCタブレット端末などでハードディスクの代わりに使用されています。
 
 むかしの入門本と比較すると、この他にもいくつか変更点があって、
   マルチコアプロセッサ (「MPU」という) による並列処理が一般化したことや、
   グラフィックボードの中に、描画処理専用のCPU (「GPU」という) と
   ビデオメモリ (「VRAM」という) があるんですが、
   これを通常のCPUや、メインメモリの代わりに使う「GPGPU」という技術が、
   ゲームソフトなどを中心に導入されています。
 
 ディスプレィの解像度や、メインメモリの容量が大幅に向上したこと、
   64bit化への移行については、後述します。
 
 Cや、C++の言語仕様も、近年になって何度か拡張されていますが、
  これはコンパイラや、それを含む開発環境のバージョンによって
  対応にばらつきがあるため、本書では、さわり程度にとどめ、
  基本的な仕様の理解に力点をおいて解説しています。
 
 

デジタルデータは、0か1かの連続。

 
・「コンピューター」というのは、「電子回路」 のことで、
 その中では、 「電気信号」 が超高速で流れています。
 
・「ツー・トン・ツー・トン・トン」 とする 「モールス信号」のように、
 電気信号のを、連続して送信することで、
 大量のデータを伝えています。
 
ハードディスク」や「CD-ROM」の円盤の表面にも、
 この「01」が、「磁気信号の」に置き換えられて
 記録されています。
 
・「モールス信号」の場合は、たとえば、
 「・・-」 なら 「A」という意味だ! ...というように、
 一定間隔の間に、どこでキーを押すのか
 対応する文字を申し合わせておいて、
 暗号による通信を実現していました。
 
コンピューターの内部データ転送も、
 これとよく似たことをしています。  
 
Windowsをお持ちの方は、「電卓」を開いてみて下さい。
 
メニューバーの「表示」をクリックして、「プログラマ」を選んで下さい。
 
・そして、適当に数値入力した後に、「2進」をクリックしてみて下さい。
 
・「0」  1」 だけの表示に切り替わったはずです。
 
・これを「2進数表記」といいます。
 
・私たちがふだん使っている数字の表記法は、
 「10進数表記」というもので、
 1ケタの数字10になると、
 1ケタ繰り上がる仕組みになっています。
 
・「9」に「1」を足すと、1ケタ繰り上がって、「10」になる。
 
2進数表記の場合は、0か1しかないため、
 11を足すと、1ケタ繰り上がって、「10」と表記されます。
 
・が、これは10進数表記の「2」、
 いわゆる2のことです。
 
  ----------------  
   2進数  10進数
  ----------------
      0        0
      1        1
    10        2  ← ココ で くり上がっている。
    11        3
  100        4
  101        5
      :         :
----------------
 
・ようするに、表記法 (書き方) が違うだけなのです。
 
 
 

デジタルデータの単位、「ビット」と「バイト」

 
デジタルデータ最小単位は、「1bit」 (ビット)です。
 
・この「1bit」には、01までの
 2通りの数値しか記憶できません。
 
・しかし、実際にあつかわれる数値は、
 もっと大きなものばかりです。
 
・そこで登場するのが、「1byte (バイト) という単位です。
 
・「1byte」は、「1bit」を8つならべたもので、「8bit」のことです。
 
コンピュータープログラムでは、メモリ記憶されたビットデータを、
 この「1バイト単位で取り出して、
 1つの数値として解釈して、操作します。
 
・それでは次に、この1byteのデータを、
 私たちがふだん使っている10進数表記の数値
 戻す方法について説明します。↓
 

  1111 1111

 
上記を、「2進数モード入力してから、
 「10進数モード切り替えてみて下さい。
 
・「255」と表示されると思います。
 
・これが「1byte」に記憶できる最大値です。
 
・「0を含めると、0255までの
 256通りの数値を、記憶できるということになります。
 
・この「バイト」という単位は、
 メモリ上の、1つの番地に、記録できるです。
 
・そして、CPUは、というと、
 4byteずつ計算するタイプが、現在の主流で、
 CやC++のコンパイラの標準の整数値
 4byte値なのは、そのためです。
 
・ちなみに、64bit システム ( 64bit版のWindowsなど ) では、
 CPUは、8byteずつ計算するため、
 標準の整数値も、8byte値になります。
 


読者登録

hasehamさんの更新情報・新作情報をメールで受取りますか?(読者登録について