C言語において、定数(ていすう、constant)とは、プログラム中で変化することのない一定の値を持つデータのことです。例えば、プログラム中で「100」「3.14」「'A'」「"Hello"」等と、データを直接書いた場合、定数となります。また、定数はリテラルとも呼ばれます。定数式とは定数のみからなる式のことです。
定数には、おもに次のような種類があります。
C言語の定数について、整数定数、浮動小数点定数、文字定数、文字列定数、列挙定数、記号定数(define構文)などについて解説しています。
C言語において、定数(ていすう、constant)とは、プログラム中で変化することのない一定の値を持つデータのことです。例えば、プログラム中で「100」「3.14」「'A'」「"Hello"」等と、データを直接書いた場合、定数となります。また、定数はリテラルとも呼ばれます。定数式とは定数のみからなる式のことです。
定数には、おもに次のような種類があります。
これらのC言語の定数について、順に説明します。
整数定数とは、例えば「100」「12」「398」のような整数の定数です。型はint型として扱われます。大きすぎてint型に収まらない場合はlong型として扱われます。
整数定数をlong型として扱いたい場合は、「0l」「24L」のように定数の末尾にl(英小文字のエル)またはLをつけます。(ただし英小文字のエルは数字の1と見間違いやすいので使用しない方がよいでしょう)
符号なしの型として扱いたい場合は、uまたはUをつけます。unsigned long型として扱いたい場合は、ulまたはULをつけます。
これらの定数の末尾につける記号をサフィックス(接尾子)と呼びます。
サフィックス(小文字も可) | 型 |
---|---|
U | unsigned |
L | long |
UL | unsigned long |
F | float |
整数定数は10進数だけでなく8進数や16進数でも表現できます。整数定数の先頭に0(数字のゼロ)をつけると8進数の意味になります。先頭に0xまたは0Xをつけると16進数の意味になります。
例えば、10進数の10は8進数で12、16進数でAなので、C言語では012や0xAと表現できます。このように先頭につける文字をプレフィックス(接頭子)と呼びます。
また、8進、16進表現の整数定数にもサフィックスをつけることが可能です。例えば0XAULは、10という値を持つunsigned long型の整数定数です。
整数定数の16進表現はよく使われますが、8進数の方はあまり使われません。この仕様を知らない人も多いので、うっかり10進定数の先頭に0をつけてしまわないように気をつけましょう。
浮動小数点定数とは、例えば「3.14」のように小数点のある定数です。指数部をつけて「314e-2」「0.314e1」のように表現することもできます。
浮動小数点定数の型はdouble型ですが、サフィックスとしてfまたはFをつけるとfloat型になります。l(英小文字のエル)またはLをつけるとlong double型として扱われます。
文字定数とは、例えば「'A'」のようにシングルクォーテーションで囲まれた1文字の定数です。文字定数の値は、通常、ASCIIコードセットの値になります。
'A'はASCIIコードでは65なので、文字定数'A'の10進表現での値は65になります。同様に文字定数'0'(数字のゼロ)の値は0ではなく0x30です。初心者の方は文字定数'0'の値も0と勘違いしやすいので、気をつけましょう。
ある種の文字は2文字で1文字を表すことがあるので、注意が必要です。例えば改行は文字定数'¥n'('\n'とも表現されます)は2文字を使用して表現していますが、実際は改行文字という1文字の文字で、値は10です。このようなエスケープ系列の一覧を以下に示します。表中の「¥」は「\」と表示されることもあります(コーディング時に使用するフォントの種類によって異なります)。
文字 | 意味 |
---|---|
¥a | 警告(ベル)文字 |
¥b | バックスペース |
¥f | 改ページ |
¥n | 改行 |
¥r | 行頭復帰 |
¥t | 水平タブ |
¥v | 垂直タブ |
¥¥ | バックスラッシュ |
¥? | 疑問符 |
¥' | シングルクォーテーション |
¥" | ダブルクォーテーション |
文字定数'¥0'は値ゼロを持つ文字です。C言語での文字列の終わりを意味します。
文字列定数とは、例えば「"This is a pen."」のようにダブルクォーテーションで囲まれた文字の列のことです。「""」も文字列定数で、これは空の文字列を表します。
文字列定数の中に"(ダブルクォーテーション)を入れたい場合は¥"として入れます。例えば"This is a pen."という文字列なら"¥"This is a pen.¥""と書きます。文字定数に使われるエスケープ系列は文字列定数でも使用可能です。
文字列定数は、コンパイル時に連結が可能です。"This is a pen."は"This is a " "pen."とも書けます。これは、長い文字列を扱う時に便利です。
列挙定数とは、下記の例にあるような整数定数のリストです。
enum boolean { NG, OK };
enum months { JAN = 1, FEB, MAR, APR, MAY, JUN,
JUL, AUG, SEP, OCT, NOV, DEC };
enum escapes { BACKSPACE = '¥b', TAB = '¥t',
NEWLINE = '¥n', RETURN = '¥r' };
デフォルトでは、enumの最初の定数は値が0で、次が値1、2と増えていきます。上記の例ではNGは0で、OKは1となります。値を入れたい場合は=で代入できます。=で指定した後も定数は1ずつ大きくなります。上記の例では、JANの値は1で、FEBの値は2、MARの値は3です。
下記のようにdefine構文を使えば、特定の文字列を記号定数(記号名)として定義できます。
#define 名前 名前と置き換わるテキスト
このように書くとコンパイラがコンパイルの直前にプログラム中の「名前」を「名前と置き換わるテキスト」に差し替えてくれるのです。「名前」は変数名と同じ形式で書くことができます。「名前と置き換わるテキスト」は、数値だけではなく任意の文字列が使用できます。
次の例はdefine構文の具体例です。記号定数の宣言以降のプログラムでSTART, END, STEPが使用可能になります。define構文の最後には;(セミコロン)をつけないことに注意してください。
#define START 2
#define END 9
#define STEP 2