基礎 C言語
  1. はじめに

  2. 標準出力

  3. 標準入力

  4. 変数

  5. 2・8・10・16進法

  6. メモリ容量の単位

  7. 変数のメモリ容量



はじめに

ここでは、C言語の基礎を説明する。
ただし、すべてを網羅しないので、C言語の習得には入門書を読むべきである。
sky氏のC言語インタプリタの統合開発環境(IDE) めじろ++98 を使用する。
他のIDEでも可。
めじろ++98 は、Windows 95,98,Me,NT,7 では動作するが、2000 では動かない。
使い方は、めじろ++ を実行後、[ファイル]→[新規ファイルを追加]で、ファイルを作成し、コードを記述後、[デバッグ・実行]→[実行]するだけである。
本来、C言語は、インタプリタではないので、Visual C++(以下 VC++) などのIDEでは、[ビルド]→[実行]という手順が必要である。ビルドとは、C言語のソースファイル(.c , .cpp, .h, .rc)を機械語に変換した後、その機械語ファイル(.obj, .res など)である中間ファイルをまとめて、実行可能ファイル(.exe, エグゼ ファイルとも言う)を作成する処理の事である。
C言語を機械語に変換する処理をコンパイルと呼び、中間ファイルをまとめる処理をリンクと呼ぶ。
コンパイルするプログラムは、コンパイラと呼び、リンクするプログラムはリンカと呼ぶが、VC++ などのIDEでは、それらのプログラムの存在を意識する必要はない。
VC++ の cl.exe は、コンパイラとリンカを制御して、実行可能ファイルを生成するプログラムであり、IDEは、これをGUIで操作できるようにしたものである。
インタプリタは、コンパイル言語に比べて、実行速度が遅いが、簡単に実行できるのでコンピューター言語の習得には適している。
OS がウィンドウズ時代のプログラムが、ウィンドウ プログラムと呼ばれるのに対し、MS-DOS 時代のは、コンソール プログラムと呼ばれる。ここで作成するのは、後者の方である。
めじろ++ は、ANSI C しか使えないから、Win32 API は使えない。
ANSI C は、関数名が printf のように総て小文字で、Win32 API は TextOut のように最初が大文字である。
コンパイラは、ソースファイルの拡張子が、.c の場合は、C言語とみなし、.cpp の場合は、C++言語とみなす。C++ は、C の機能を拡張したもので、C のコードもそのまま使える。

コードにバグがあるとコンパイルできない。あるいは、実行後に動作不良を起こす。バグを失くすには、バグの箇所を特定しなくてはならない。それには、正常動作するコードをコメントアウトしたり、コンソールの場合であれば、printf() で、ウィンドウの場合であれば、MessageBox() や SetWindowText() で変数の値を表示し、確認する必要がある。ANSI C や API などの関数は、対応するヘッダとライブラリの記述やリンク設定が必要である。ただし、多くの API 関数は、最初から IDE で設定されてあるから記述やリンク設定は必要ない。例えば、sprintf() を使う時は、コードの最初に #include <stdio.h> と記述する必要がある。コモンコントロールを使う時は、 #include <commctrl.h> と #pragma comment(lib, "comctl32.lib") の両方の記述が必要である。MSDN の該当関数の説明に、必要なヘッダとライブラリのファイル名が書いてある。MSDN に説明がなくてもヘッダの内容を読めば、使い方が分かる場合もある。VC++ には、複数のファイルの記述内容から検索できる機能がある。[編集]→[ファイルから検索]で行う。検索する場所は、IDE が保存されているディレクトリである。


標準出力

例えば、hello.c というファイルを作成して、以下のコードを記述し、実行すると、hello という文字が表示される。printf() は、標準出力の関数である。main (メイン)関数は、プログラマーが記述する最初の関数であり、コンソール プログラムでは、その関数名は、main と決められている。
VC++ で、ANSI C の標準入出力関数を記述するには、最初に、#include <stdio.h> という記述が必要だが、めじろ++ では必要ない。
main()
{
    printf("hello");
}
		


標準入力

めじろ++ では、新しくプログラムを作るときは、その前に、以前のファイルを保存後、[新規]→[新規ファイルを追加]が必要である。
また、以前に作成したファイルが、プロジェクトに残ったままになっているため、[プロジェクト]→[ファイルを除外]という操作が必要である。
以前に作成したファイルを読み込みたいときは、[ファイル]→[ファイルをプロジェクトに追加]を実行する。
ユーザーからのキー入力を取得する関数を標準入力関数と呼び、scanf() である。
文字列中の \n は改行コードで、改行する。
int n; は、変数の宣言で、プログラマーが数字を入れる場所を作成している。
ここでは、ユーザーが入力する数字を入れるのに使用している。
n は変数名で、半角英数字なら何でも良いが、1文字目は必ず英字という決まりがある。
C では、変数は、一番上に記述する決まりがある(C++ の場合は一番上でなくても使う前にあれば良い)。
%d は、入力の場合は、変数 n に数字として入れる、出力の場合は、数字として出力するという指示である。
int 型の変数は、通常、数字を入れるのに使うため、int と %d はセットで使われると考えて良い。
ウィンドウプログラムは、対象となるウィンドウがアクティブになっていないと処理を受け付けないものがある。
ウィンドウをアクティブにするには、そのウィンドウのどこかをクリックする。
main()
{
    int n;

    printf("このウィンドウをクリック後、何か数字を入力して、Enter キーを押してください\n");
    scanf("%d", &n);
    printf("入力された数字は、%d\n", n);
}
		


変数

変数は、整数型の int 以外に、浮動小数点数型の float, 文字型の char などがある。
それぞれを画面に出力すると以下のようになる。
%f は不動小数点数として、%c は文字として出力するという指示である。
%f は float 型と double 型の変数を表示するときに使うと考えて良い。
%c は 文字の表示に使うのだが、char 型変数の表示には、%d を使うこともある。
char 型変数に %d を使うと、その文字の文字コードが表示される。
%d は、整数を 10 進数として表示するが、%x を使うと、16 進数として表示する。
%o は、8 進数表示だが、ほとんど使う機会がない。
= は代入演算子で、右の値を左の変数に格納する。算数の = とは全く意味が異なる。
以下のコードでは、変数の定義と同時に値を代入しているが、これを特に、「変数の初期化」と呼ぶ。
float 型の変数は、末尾に f を付ける決まりがある。
文字は、'(クオーテーション マーク)でくくる。char 変数には半角文字を1文字だけ入れられる。
Visual C++ の scanf では、%d に BYTE や bool などの変数は使えない。int と BOOL が使える。%c にも BYTE は使えない。使えるのは char のみである。printf の場合は、制限はない。
main()
{
    int     n = 5;
    float   f = 6.5f;
    double  w = 3.2;
    char    c = 'A';

    printf("%d %f %f %c %d %x %o", n, f, w, c, c, c, c);
}

----- 出力結果 -----
5 6.500000 3.200000 A 65 41 101
--------------------
		


2・8・10・16進法

コンピュータープログラミングでは、2進数や16進数を使うことも多い。
10進法は、9の次に位が上がるが、2進法は、1の次、8進法は、7の次、16進法は、Fの次に位が上がる。

2進法 : 0, 1, 10, 11, 100, 101, 110, 111, 1000, 1001, 1010...
8進法 : 0, 1, 2, 3, 4, 5, 6, 7, 10, 11, 12, 13, 14, 15, 16, 17, 20...
10進法 : 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16...
16進法 : 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F, 10, 11, 12...

10進法から各記数法、また、各記数法から10進法に変換する計算方法があるのだが、それは、ここでは説明しない。情報処理試験対策の本や雑誌に載っているだろう。
[アクセサリ]の[電卓]で、[表示]→[関数電卓](WinXp以前)、または、[表示]→[プログラマ](Win7)でそれぞれ変換可能である。

10進数の 255 は、16進数の FF であり、2進数の 11111111 である。


メモリ容量の単位

例えば、ファイルサイズは、バイトという単位を使う。1バイトは、8ビットの事である。ビットは、2進数の桁の数の事である。例えば、00001111 という2進数がある場合、一番右の桁を最下位ビット、左から数えて4つ目までの桁を上位4ビットと言ったりする。この例では、最下位ビットは 1、最上位ビットは 0、上位4ビットは 0000 になる。
1キロバイト(KB)は、1024バイトの事で、1メガバイト(MB)は、1024 KB の事で、1ギガバイト(GB)は、1024 MB の事で、1テラバイト(TB)は、1024 GB の事である。


変数のメモリ容量

Win32 OS (Win95 以降)では、int 型の変数は、4バイトの容量である。
Win16 OS (Win3.1 以前)の int 型の変数は、2バイトだった。
変数は、その変数の容量を超える数値は扱えない。
変数の最上位ビットは、符号ビットであり、それが 0 の場合は、正の数、1 の場合は、負の数を表す。
変数の定義のときに、型の前に unsigned を付けると最上位ビットは、符号ビットにならず、すべて正の数になる。
例えば、short 型は、2バイトの容量なので、-32768 〜 32767 の数値を扱える。
unsigned short 型の場合は、0 〜 65535 の数値を扱える。
unsigned float や unsigned double は存在しない。
char   : 1 バイトの符号付き整数(-128 〜 127)(主に文字を格納するのに使用)
int    : 2 または 4 バイトの符号付き整数
short  : 2 バイトの符号付き整数(-32,768 〜 32,767)
long   : 4 バイトの符号付き整数(-2,147,483,648 〜 2,147,483,647)
float  : 4 バイトの符号付き不動小数点数(3.4E-38 〜 3.4E+38)
double : 8 バイトの符号付き不動小数点数(1.7E-308 〜 1.7E+308)

unsigned char   : 1 バイトの符号なし整数(0 〜 255)(主に文字を格納するのに使用)
unsigned int    : 2 または 4 バイトの符号なし整数
unsigned short  : 2 バイトの符号なし整数(0 〜 65,535)
unsigned long   : 4 バイトの符号なし整数(0 〜 4,294,967,295)
		
以下のコードでは、8000 という数値の前に、0x が付いているが、これはその数値を16進数として扱うという意味である。16進数の 8000 を 2進数に変換すると、16ビットの最上位ビットが、1 でそれ以降は、すべて 0 が並ぶことが分かるだろう。
0x の代わりに 0 を数値の先頭に付けると、8進数になる。
sizeof 演算子は、変数や配列のメモリ容量をバイト単位で返す。
main()
{
    char           c;
    short          h  = 0x8000;
    unsigned short uh = 0x8000;
    long           l;
    float          f;
    double         w;

    printf("符号つき:%d 符号なし:%d short:%d unsigned short:%d long:%d 
           float:%d double:%d char:%d", h, uh, 
           sizeof(c), sizeof(h), sizeof(uh), sizeof(l), sizeof(f), sizeof(w));
}

----- 出力結果 -----
符号つき:-32768 符号なし:32768 char:1 short:2 unsigned short:2 long:4 float4 double:8
--------------------