第 6 章 C 言語入門
6.5 C 言語の基本的な注意
6.5.1 C の基本的な構造
Cのプログラムは, コメント(注釈) (comment),プリプロセッサ命令(preprosessing),文 (state-ment),関数(function)の集まりで構成されている. それぞれの文は,; で終るか,{ }で囲まれた文の集 まりである複文(compound statement)で構成されている. 関数自身もまた文である. 実際には,main という名前の特別な関数がはじめに実行され,そこに記述されている順序にしたがって実行される.
2 これはmuleの“c-mode”の特徴である.
3 多くのUNIX上の処理系では,コンパイラが出力する実行コードのデフォールトの名前はa.outになる. これは, Assembra
Outputの略.最近のLINUX, FreeBSDではelfという名前になるものがある.これら実行形式の名前の違いは,実行形式の違い
でもある.
4 UNIXではカレントディレクトリはデフォールトではコマンドサーチパスには入っていないし,入れない方が望ましい.
Id: C1.tex,v 1.8 2001-03-17 13:30:57+09 naito Exp
6.5.2 C で利用できる文字
Cでは, 英文字,数字, 空白文字(スペース, タブなど),記号文字, 改行文字などが利用できる. 記号文 字には特別な意味があることが多いので,注意すること. またCでは,大文字と小文字は区別される. Cの コンパイラにおいて,日本語が利用できるといっても,変数名などに日本語が利用できるわけではないので 注意すること. 日本語が利用できるのは,文字列に日本語が利用できるという程度の意味であり,今回利用 する処理系では,このコードはEUCでなければならない.
また,以下のものは全て空白と見なして無視される.
• 空白文字,改行文字,タブ,改ページ記号,コメント.
行末に\を書くと, 行の連結を表し, 1行として扱われる.
6.5.2.1 行
C言語では「行」という概念は存在しない. 改行文字は空白文字と見なされるが,改行文字の直前に/が ある場合には,行の連結を表し,処理系によって/と改行文字の連続は一つの空白文字に置き換えられる.
6.5.3 コメント
コメント(comment)とは,プログラミングの補助となるようソースプログラム中に書かれた注釈部分
のこと. コンパイラは単にこれを無視するので,プログラムには影響を与えない. コメントは, /* ではじ まり,*/で終り,入れ子にはできない. 即ち,コメントの中にコメントを入れることはできない.
また,文字定数,文字列の中にはコメントを書くことはできない.
6.5.4 トークン
トークン (token)とは,空白やコメントによって区切られた文字の列で,コンパイラが認識する最小の
単位である. トークンは以下のいずれかに分類される.
• 演算子(+ - など)
• デリミタ(区切り子)({ } ( ) ; など)
• 定数(整数,浮動小数点数,文字定数)
• 文字列リテラル
• 識別子
• キーワード
6.5.4.1 定数
C言語における定数(constant)は整数定数,浮動小数点定数, 文字定数, 列挙定数に分類される. 整数 定数は,8進数,10進数,16進数による表現が可能である. それぞれを区別するには,以下の規約による.
• 16進数:0xで始まり,後に0〜9, a〜fがいくつか続く. a〜fと xは大文字でも良い.
• 10進数:0以外ではじまり,後に0〜9 がいくつか続く.
• 8進数 :0で始まり,後に0〜7がいくつか続く.
0x10を 0x0010と書いても良い.
また, 整数定数に u または U をつけると, 符号なしの数を表し, l または L をつけると “長い” 整数
(long)を表す.
浮動小数点定数は, 以下の形をしている.
Id: C1.tex,v 1.8 2001-03-17 13:30:57+09 naito Exp
整数部 . 小数部 e 指数 接尾子
“e 指数” 部分は省略することができる. また,指数の記号 eは E を用いても良い. 接尾子は以下のいず れか.
• fまたはF:float型
• 接尾子なし: double型
• lまたはL:long double型
文字定数とは,’で括られた文字の列である. 例えばaという文字を表すには’a’と書く.
以下の特別な文字を表す以外には,文字定数は一文字でなくてはならない.
• \n改行
• \r復帰
• \f改ページ
• \t水平タブ
• \v垂直タブ
• \b後退
• \aベル
• \? ?
• \’ ’
• \" "
• \\ \
• \ooo8進数でooo. 3桁以下
• \xhh16進数でhh. 2桁以下
このような特別な文字のことをエスケープ文字(escape charactor)と呼ぶ.
6.5.4.2 文字列リテラル
文字列定数とも呼ばれ,"で囲まれた文字の列である. 文字列リテラル5(string literal)が記憶域に格 納される時には, 末尾に\0が付けられる. また, 隣接する2つ以上の文字列リテラルは連結される. 例え ば"abc" "ABC" は"abcABC"となる.
また,
"abc"
"ABC"
は"abcABC"に連結される.
6.5.4.3 識別子
識別子(identifier)とは,変数,関数などに付けられる名前のことである. ここで与えられた名前にした
がって,コンパイラはそれぞれを区別する.
識別子として使える文字は,英文字, 数字, _であって,数字を先頭にすることはできない. また, C言語 の規約によって, 31文字までは区別され,大文字と小文字は区別される6. 即ち, 32文字目以後が異なるよ うな2つの名前は区別されるとは限らない.
5 「リテラル」(“literal”)とは,「文字通りの」という意味である.
6 正確には,
• 内部識別子またはマクロ名においては意味のある先頭の文字数は31文字であり,大文字と小文字が区別される.
• 外部識別子においては意味のある先頭の文字数を6文字に制限して良く,大文字と小文字の区別を無視しても良い.
というのがANSIの規格[3, X3010 6.1.2, p. 1856]である.しかし,最近の処理系で外部識別子が6文字に制限されたり,大文字と 小文字の区別を無視するようなものは見当たらない.
Id: C1.tex,v 1.8 2001-03-17 13:30:57+09 naito Exp
また, C 言語には名前空間,スコープという概念があり, 同じ名前を与えても, 違うものを示しているこ とがあるので注意すること. これについては後ほど解説する.
6.5.4.4 キーワード
以下の単語はキーワード(keyword)と呼ばれ,特別な意味を持ち,識別子としては利用できない.
char double int long enum float short
unsigned signed void typedef auto register extern static volatile union struct const sizeof if
else switch case default break return for
while do continue goto
6.5.5 文
文 (statement)とは, C言語のプログラムの基本的な単位になるもので,それぞれの文は; によって
終了する. 一つの文が複数行にわたっても良い.
Example 6.5.1 次の各行は全て文である.
int n ;
printf("Hello World.\n") ; x + y ;
a = b ;
;
最後の行は空文と呼ばれる.
また,{,}によって文の集まりを一つの文(複文(compound statement))にすることができる.
Example 6.5.2 次は一つの複文である.
{
a = b ; c = d ; }
6.5.6 式
式 (expression)とは,計算を行なう最小単位のことで,それぞれの式は値を持つ. その値は, 次のよう
にして決まる.
• 計算式の場合は,その結果.
• 代入式の場合は,その左辺の値.
• 関数の場合は,その戻り値.
• 比較の場合,真ならば1,偽ならば0.
式に; をつけることにより,文にできる. それを式文(expression statement)と呼ぶ.
Example 6.5.3 次のようなものは式文である.
a ; /* 値は a */
x + y ; /* 値は x + y */
a = b ; /* 値は代入された a の値 */
printf("Hello World.\n") ; /* 値はこの関数の戻り値 */
a = b = c ; /* 値は代入された a の値 */
a = b, c = d ; /* 値は最後に代入された c の値 */
a < b ; /* 値は真ならば 1, 偽ならば 0 */
Id: C1.tex,v 1.8 2001-03-17 13:30:57+09 naito Exp