C 言語入門
C について
C は,1970 年代初頭に AT&T ベル研究所で開発された手続き型言語です。
元々は UNIX の記述用に開発された言語で,現在でもオペレーティングシステムの記述に使われます。
UNIX の発展と相まって,最も普及したプログラミング言語の一つとなりました。
個人的には,最初に勉強したプログラミング言語が C で,大学でも C を触ることが多かったので,C はよく知っていて愛着のある言語です。
柔軟な記述が可能で,どんなプログラムも書けてしまうのが C の大きな強みですが,それが多くのバグをもたらしているのも事実で,C の功罪は大きいと思います。
規格
1978 年に初版が発行された The C Programming Language が,C のバイブルとして有名です。
著者 B. W. Kernighan, D. M. Ritchie の名前の頭文字から,通称 K&R と呼ばれています。
最初に C の標準規格が制定されるまでは,K&R (初版) が実質的な C の規格の役割を果たしました。
その頃の C を K&R C と呼んだりします。
最初に標準規格が制定されたのは 1989 年で,ANSI C,C89 と呼ばれています。
C89 以降では,1999年に C99,2011 年に C11 が制定されています。
Hello World
次のプログラムは,C の Hello World プログラムです。
#include <stdio.h>
int main(void)
{
printf("hello, world\n"); /* 文字列を出力 */
return 0; /* 実行環境に 0 を返す */
}
- 波括弧で囲まれた範囲 { ... } は,ブロック (block) と呼ばれます。
- フリーフォーマットであり,インデントの深さに文法的な意味はありません。
- 大文字と小文字は区別されます。
- 実行の最小単位は文 (statement) であり,すべての文の終端にはセミコロン ; が付きます。
- 文字列はダブルクォーテーション "..." で囲って表します。\n は改行を表します。
- /* から */ まではコメントとして扱われます (入れ子不可)。
- 多くの処理系は // から始まる単一行コメントもサポートします。
ソースコードは hello.c などのファイルに保存し,コンパイルします。
拡張子は .c が一般的です。
コンパイルしたプログラムを実行すると,次のように表示されます。
hello, world
関数
他の言語でいうサブルーチンや手続きに相当するものを,C では関数 (function) と呼びます。
Pascal では返り値の無いものを手続きと呼びますが,C ではその区別はありません。
先のプログラムの printf(...) では,文字列を標準出力に出力する関数 printf を呼び出しています。
printf 関数の使用法など詳細は別の章で紹介します。
次のプログラムは,2 整数の和を求める簡単な関数 add を定義したものです。
#include <stdio.h>
/* 関数 add の定義 */
int add(int a, int b)
{
return a + b; /* a + b を返り値とする */
}
int main(void)
{
printf("%d\n", add(2, 3));
return 0;
}
5
一般に,関数は次の形式で定義します。
返却型 関数名(型1 引数1, 型2 引数2, ...)
{
...
}
関数内の return 文は,関数の返り値を指定するために用います。
main 関数
C の実行可能プログラムには,必ず 1 つの main 関数を定義します。
main 関数はプログラムのエントリポイント (開始地点) となる特殊な関数です。
main 関数の返り値は,プログラムの返り値として,実行環境へと通知されます。
返り値 0 は普通,正常終了を表します。
プリプロセッサディレクティブ
記号 # から始まる行はプリプロセッサディレクティブ (preprocessor directive) と呼ばれ,コンパイルを行う前の段階で解釈されます。
プリプロセッサディレクティブは純粋な C のコードとは異なり,それぞれ独立した 1 行に書く必要があります。
先のプログラムの #include
前処理の段階で,ファイル stdio.h の内容がこの場所に展開されます。
ちなみに,1 ソースファイルに前処理を施したものを,翻訳単位 (translation unit) と言います。
実際の開発では,複数の翻訳単位から一つのプログラムを作成することがよくあります。
他によく使われる命令として,記号定数を定義する #define があります。
次に示す例では,コード中の HELLO が前処理の段階で "hello, world\n" に置換されます。
#include <stdio.h>
#define HELLO "hello, world\n" /* 記号定数を定義 */
int main(void)
{
printf(HELLO); /* HELLO は "hello, world\n" に置換される */
return 0;
}
hello, world