C言語の基本|整数・小数・文字の定数

ソースコードに直接書く値にも種類がある。定数の表し方を知って、数字と文字を正しく使い分けよう。

これまでの学習では、変数を宣言し、初期化や代入によって値を保存する方法を確認しました。

たとえば、次のコードでは、int型のnumberという変数へ123を入れています。

int number = 123;

この1行には、変数と、その変数へ入れる値の両方が書かれています。

  • numberは値を保存する変数
  • 123はソースコードへ直接書かれた整数定数

変数は、プログラムの実行中に値を変更できます。一方、123はソースコード上へ直接書かれた固定の値です。

C言語では、数値や文字をソースコードへ直接書くときにも、その種類に合った表記方法があります。

このパートでは、次の定数やリテラルを詳しく見ていきます。

  • 10進数で書く整数定数
  • 8進数で書く整数定数
  • 16進数で書く整数定数
  • 小数点形式の浮動小数点定数
  • 指数形式の浮動小数点定数
  • C99以降で使える16進浮動小数点定数
  • 1文字を表す文字定数
  • 文字の並びを表す文字列リテラル
  • 改行などを表すエスケープシーケンス

種類が多いように見えますが、最初によく使うのは123、3.14、'A'、"ABC"の4つです。

まずは、ソースコードへ直接書かれた値にも種類と書き方のルールがあることをつかんでいきましょう。

変数と定数の違い

変数は、値を保存しておくための名前付きの入れ物です。

int number = 123;

このコードでは、numberが変数、123が整数定数です。

変数numberには、後から別の値を代入できます。

number = 200;

さらに、0を代入することもできます。

number = 0;

numberへ保存される値は、代入によって123から200、200から0へ変化します。

一方、ソースコードに書かれた123や200は、それぞれの場所に直接記述された値です。プログラムの実行中に、ソースコード上の123そのものが200へ書き換わるわけではありません。

要素役割
変数number値を保存する名前付きの入れ物
整数定数123ソースコードに直接書かれた整数
浮動小数点定数3.14ソースコードに直接書かれた小数
文字定数'A'ソースコードに直接書かれた1文字
文字列リテラル"ABC"ソースコードに直接書かれた文字の並び

このようなソースコード上の値は、変数の初期化、代入、計算、条件の指定、printfによる表示などで使われます。

constを付けた変数との違い

C言語では、constを付けて、初期化後に変更できないオブジェクトを宣言することもできます。

const int maximum_score = 100;

このコードでは、maximum_scoreがconstで修飾された変数、100が整数定数です。

どちらも変更しない値のように見えますが、役割は異なります。

種類意味
整数定数100ソースコードへ直接書いた整数
constを付けた変数maximum_score100を保存している名前付きの領域

このパートでは、主に123や3.14など、ソースコードへ直接記述する値について見ていきます。

図1:変数は箱、定数は箱へ入れる値

この図から分かること

変数numberは、値を保存する箱のような役割を持っています。123は、その箱へ入れるためにソースコードへ直接書かれた整数定数です。

numberへ200を代入すると、変数に保存されている値は123から200へ変わります。しかし、ソースコードに記述された123という表記自体が、実行中に書き換えられるわけではありません。

定数の種類を一覧で確認しよう

C言語で扱う主な定数と文字列リテラルは、次のように分類できます。

分類種類表記方法
整数定数10進整数定数通常の整数として書く123
整数定数8進整数定数先頭に0を付ける0173
整数定数16進整数定数先頭に0xまたは0Xを付ける0x7B
浮動小数点定数小数点形式小数点を使う3.14
浮動小数点定数指数形式eまたはEを使う1.23e-12
浮動小数点定数16進形式0xとpまたはPを使う0xA.Fp-10
文字定数1文字単一引用符で囲む'A'
文字定数特殊文字エスケープシーケンスを使う'\n'
文字列リテラル文字の並び二重引用符で囲む"ABC"

特に使用する機会が多いのは、次の4種類です。

  • 123のような10進整数定数
  • 3.14のような浮動小数点定数
  • 'A'のような文字定数
  • "ABC"のような文字列リテラル

さまざまな定数を表示するプログラム

最初のプログラムでは、整数、浮動小数点数、文字、文字列をprintfで表示します。

整数・小数・文字・文字列をまとめて表示するプログラム

ファイル名:4_4_1.c

// 整数・小数・文字・文字列をまとめて表示するプログラム
#include <stdio.h>

int main(void)
{
    printf("10進整数定数:%d\n", 125);
    printf("8進整数定数0175を10進数で表示:%d\n", 0175);
    printf("16進整数定数0x7Dを10進数で表示:%d\n", 0x7D);

    printf("浮動小数点定数:%.2f\n", 2.75);
    printf("指数形式の浮動小数点定数:%e\n", 4.50e-8);

    printf("文字定数:%c\n", 'B');
    printf("文字列リテラル:%s\n", "C言語の定数を学習しています");

    return 0;
}
実行結果の例
10進整数定数:125
8進整数定数0175を10進数で表示:125
16進整数定数0x7Dを10進数で表示:125
浮動小数点定数:2.75
指数形式の浮動小数点定数:4.500000e-08
文字定数:B
文字列リテラル:C言語の定数を学習しています

このプログラムでは、10進数、8進数、16進数という異なる表記で、同じ125を表しています。

また、小数点形式と指数形式の浮動小数点定数、1文字を表す文字定数、複数の文字を表す文字列リテラルも確認できます。

10進整数定数を表示する

最初のprintfでは、125を10進整数定数として使用しています。

printf("10進整数定数:%d\n", 125);

125は、普段使っている10進数の書き方です。

%dを使うことで、10進整数として表示しています。

8進整数定数を10進数で表示する

次のprintfでは、0175を使用しています。

printf("8進整数定数0175を10進数で表示:%d\n", 0175);

先頭に0が付いているため、0175は8進整数定数です。

8進数の175を10進数へ変換すると、次のようになります。

1 × 82 + 7 × 81 + 5 × 80
= 64 + 56 + 5
= 125

printfでは%dを使用しているため、実行結果には10進数の125と表示されます。

16進整数定数を10進数で表示する

次のprintfでは、0x7Dを使用しています。

printf("16進整数定数0x7Dを10進数で表示:%d\n", 0x7D);

先頭に0xが付いているため、0x7Dは16進整数定数です。

16進数では、Dが10進数の13を表します。

7 × 161 + 13 × 160
= 112 + 13
= 125

この値も%dで表示しているため、実行結果では125になります。

整数定数には複数の表記方法がある

整数定数とは、小数部分を持たない整数をソースコードへ直接書いたものです。

C言語では、主に次の3種類の表記を使用できます。

表記方法基数10進数での値
10進整数定数10125125
8進整数定数80175125
16進整数定数160x7D125

同じ値でも、用途に応じて表記方法を選べます。

10進整数定数

10進整数定数は、普段の整数と同じように書きます。

123
456
2026

10進数では、0から9までの数字を使います。

特別な接頭辞は必要ありません。

int year = 2026;
int student_count = 30;
int temperature = -5;
  • 2026は正の整数
  • 30も正の整数
  • -5は負の値

厳密には、-5全体が1つの整数定数なのではなく、整数定数5へ単項マイナス演算子-を適用した式です。初心者の段階では、負の整数を表す一般的な書き方として理解しておけば大丈夫です。

8進整数定数

8進整数定数は、先頭に0を付けて書きます。

0175

8進数で使用できる数字は、0から7までです。

使用できる数字0、1、2、3、4、5、6、7
使用できない数字8、9

そのため、次の表記は8進整数定数として正しくありません。

08
09

先頭の0によって8進数として解釈されますが、8進数には8と9が存在しないため、コンパイルエラーになります。

先頭の0には注意する

10進数の桁をそろえるつもりで先頭に0を付けると、値の意味が変わる場合があります。

int first_value = 123;
int second_value = 0123;

first_valueへ入るのは、10進数の123です。

second_valueへ入るのは、8進数の123です。10進数では83になります。

表記C言語での解釈10進数での値
12310進整数定数123
01238進整数定数83

10進整数として書きたい場合は、必要のない先頭の0を付けないようにしましょう。

16進整数定数

16進整数定数は、先頭に0xまたは0Xを付けます。

0x7D
0X7D

xを小文字で書いても、Xを大文字で書いても意味は同じです。

16進数では、0から9に加えてAからFを使用します。

16進数の文字10進数での値
Aまたはa10
Bまたはb11
Cまたはc12
Dまたはd13
Eまたはe14
Fまたはf15

次の4つは、すべて同じ値を表します。

0x7d
0x7D
0X7d
0X7D

16進数は、メモリ上の値、ビットの並び、文字コード、色の値などを扱う場面でよく使われます。

図2:10進・8進・16進で同じ整数を表す

この図から分かること

10進数の125、8進数の0175、16進数の0x7Dは、表記方法は違いますが、同じ値を表しています。

C言語は整数定数の先頭を見て、どの進数で書かれているのかを判断します。

  • 接頭辞のない125は10進整数定数
  • 先頭が0の0175は8進整数定数
  • 先頭が0xの0x7Dは16進整数定数

特に注意したいのは、10進数の桁をそろえるために先頭へ0を付けると、8進数として解釈されることです。

浮動小数点定数は小数を表す

浮動小数点定数は、小数を含む値をソースコードへ直接書いたものです。

代表的な書き方は、次のとおりです。

3.14
0.5
12.0

小数点を含むことで、整数定数ではなく浮動小数点定数として扱われます。

int count = 12;
double distance = 12.0;

12は整数定数です。

12.0は浮動小数点定数です。

見た目の値は近くても、C言語では異なる種類の定数として扱われます。

小数点形式の浮動小数点定数

小数点を使う形式は、日常的な小数と同じように書けます。

3.14
0.25
18.5
100.0

変数の初期化にも使用できます。

double temperature = 24.5;
double distance = 12.75;
double average_score = 82.5;

printfでdouble型の値を表示するときは、%fを使用します。

printf("%f\n", 3.14);

小数点以下の表示桁数を指定する場合は、%.2fなどを使用します。

printf("%.2f\n", 3.14);

実行結果は次のようになります。

3.14

指数形式の浮動小数点定数

非常に大きな値や非常に小さな値は、指数形式で書くと分かりやすくなります。

1.23e-12
1.23E-12

eとEのどちらを使っても意味は同じです。

1.23e-12は、次の値を表します。

1.23 × 10-12

指数部分が正の場合は、大きな値を表せます。

2.5e6

これは、次の値を表します。

2.5 × 106

10進数で表すと2500000です。

指数部分が負の場合は、小さな値を表します。

4.5e-8

これは、次の値を表します。

4.5 × 10-8

指数形式の主な構成は、次のとおりです。

部分意味
仮数部1.23基本となる値
eまたはEe10のべき乗を使うことを表す
指数部-1210を何乗するかを表す

科学計算や測定値など、桁数の多い値を扱うときに便利です。

%eで指数形式を表示する

printfで%eを使用すると、浮動小数点数を指数形式で表示できます。

printf("%e\n", 1.23e-12);

実行結果の例は、次のとおりです。

1.230000e-12

%Eを使うと、指数を表す文字が大文字になります。

printf("%E\n", 1.23e-12);

実行結果の例は、次のとおりです。

1.230000E-12

16進浮動小数点定数

C99以降では、浮動小数点数を16進形式で書くこともできます。

0xA.Fp-10
0XA.FP-10

この形式では、次の記号を使用します。

部分役割
0xまたは0X16進形式であることを表す
A.F16進数で書かれた仮数部
pまたはP2のべき乗を使う指数形式
-102を何乗するかを表す指数部

10進の指数形式ではeまたはEを使いますが、16進浮動小数点定数ではpまたはPを使います。

これは、指数部分が10のべき乗ではなく、2のべき乗を表すためです。

16進浮動小数点定数は、初心者向けの一般的なプログラムでは、ほとんど使用しません。

今の段階では、次の点を知っておけば十分です。

  • C99以降で使用できる
  • 先頭に0xまたは0Xを付ける
  • 指数部分にはpまたはPを使う
  • 通常は10進の小数点形式や指数形式を使えばよい

浮動小数点定数には誤差が生じることがある

3.14や0.2などの浮動小数点定数は、コンピューターの内部で常に完全に正確に表現できるとは限りません。

コンピューターは数値を有限のビット数で保存します。0.1や0.2のような10進小数は、2進数では有限の桁で表せないため、近い値へ丸めて保存されます。

たとえば、次の計算を考えてみましょう。

double result = 0.1 + 0.2;

数学上の結果は0.3ですが、表示桁数を増やすと、次のように見えることがあります。

0.30000000000000004

これは、0.1と0.2が内部で近似値として保存されているためです。

浮動小数点定数としてソースコードへ直接書いた場合でも、浮動小数点数が持つ誤差の性質は変わりません。

文字定数は1文字を表す

文字定数は、1文字を表すための値です。

C言語では、文字を単一引用符で囲みます。

'A'
'B'
'x'
'7'

文字定数は、char型の変数を初期化するときによく使います。

char grade = 'A';
char symbol = '#';
char digit = '7';

'7'は数字の形をした文字です。整数定数の7とは異なります。

表記種類意味
7整数定数数値としての7
'7'文字定数文字としての7

printfで文字を表示するときは、%cを使います。

printf("%c\n", 'A');

実行結果は次のようになります。

A

エスケープシーケンスで特殊な文字を表す

改行やタブなど、通常の方法では書きにくい文字は、エスケープシーケンスで表します。

よく使うエスケープシーケンスは、次のとおりです。

表記意味
\n改行
\t水平タブ
\バックスラッシュ
\'単一引用符
\"二重引用符

改行を表す文字定数は、次のように書きます。

'\n'

文字列の中でも使用できます。

printf("1行目\n2行目\n");

実行結果は次のようになります。

1行目
2行目

文字列リテラルは文字の並びを表す

文字列リテラルは、複数の文字が並んだデータを表します。

C言語では、文字列を二重引用符で囲みます。

"ABC"
"computer"
"C language"
"こんにちは"

printfで文字列を表示するときは、%sを使用できます。

printf("%s\n", "C言語を学習中です");

また、文字列リテラルをprintfの第1引数として直接使用することもできます。

printf("C言語を学習中です\n");

1文字の文字列も文字定数とは異なる

'A'と"A"は、どちらも画面へ表示するとAに見えますが、C言語では別のものです。

種類表記囲み方内容主な変換指定
文字定数'A'単一引用符1文字%c
文字列リテラル"A"二重引用符Aと終端を表すヌル文字%s

文字列リテラルの"A"には、文字Aの後ろに文字列の終わりを表すヌル文字\0が含まれています。

概念的には、次の2文字が並んでいます。

A \0

そのため、文字定数'A'と文字列リテラル"A"は、用途も内部の扱いも異なります。

図3:文字定数と文字列リテラルの違い

この図から分かること

文字定数'A'は1文字を表し、単一引用符で囲みます。printfでは%cで表示します。

文字列リテラル"A"は文字の並びを表し、二重引用符で囲みます。printfでは%sで表示できます。

"A"には、見えているAだけでなく、文字列の終わりを表すヌル文字\0も含まれています。そのため、'A'と"A"は同じものではありません。

%cと%sを間違えないようにしよう

文字定数を表示するときは%cを使います。

printf("%c\n", 'A');

文字列リテラルを表示するときは%sを使います。

printf("%s\n", "A");

どちらも実行結果はAですが、渡しているデータの種類が違います。

次の組み合わせを覚えておきましょう。

表示するもの値の例printfの変換指定
整数125%d
浮動小数点数2.75%f
指数形式の小数4.5e-8%e
文字'A'%c
文字列"ABC"%s

変換指定と渡す値の種類が合っていないと、正しい結果は保証されません。

定数は初期化で使われる

変数を宣言すると同時に値を設定するとき、初期値として定数を使えます。

int score = 80;
double rate = 3.14;
char grade = 'A';

それぞれの右辺には、次の定数が書かれています。

初期化使用している定数
int score = 80;整数定数80
double rate = 3.14;浮動小数点定数3.14
char grade = 'A';文字定数'A'

初期化では、宣言と同時に定数の値が変数へ保存されます。

定数は代入でも使われる

宣言済みの変数へ値を代入するときにも、定数を使用します。

score = 90;
rate = 3.14159;
grade = 'B';

右辺の90、3.14159、'B'が、それぞれ変数へ代入する定数です。

変数へ新しい値を代入すると、以前に保存されていた値が置き換えられます。

int score = 80;

score = 90;

最初に整数定数80で初期化し、その後、整数定数90を代入しています。最後にscoreへ保存されている値は90です。

定数の種類を変数で確認するプログラム

次のプログラムでは、整数定数、浮動小数点定数、文字定数を使って変数を初期化します。文字列リテラルはprintfへ直接渡して表示します。

定数で変数を初期化して種類を確認するプログラム

ファイル名:4_4_2.c

// 定数で変数を初期化して種類を確認するプログラム
#include <stdio.h>

int main(void)
{
    int decimal_value = 125;      // 10進整数定数
    int octal_value = 0175;       // 8進整数定数
    int hex_value = 0x7D;         // 16進整数定数

    double distance = 2.75;       // 小数点形式
    double tiny_value = 4.5e-8;   // 指数形式

    char symbol = 'B';            // 文字定数

    printf("10進整数定数の値:%d\n", decimal_value);
    printf("8進整数定数の値:%d\n", octal_value);
    printf("16進整数定数の値:%d\n", hex_value);

    printf("小数点形式の値:%.2f\n", distance);
    printf("指数形式の値:%e\n", tiny_value);

    printf("文字定数の値:%c\n", symbol);
    printf("文字列リテラル:%s\n", "定数の種類を確認しました");

    return 0;
}
実行結果の例
10進整数定数の値:125
8進整数定数の値:125
16進整数定数の値:125
小数点形式の値:2.75
指数形式の値:4.500000e-08
文字定数の値:B
文字列リテラル:定数の種類を確認しました

3種類の整数定数を確認しよう

最初の3つの変数は、異なる表記の整数定数で初期化されています。

int decimal_value = 125;
int octal_value = 0175;
int hex_value = 0x7D;

表記は異なりますが、すべて10進数の125を表しています。

そのため、%dで表示した結果は、すべて125です。

10進整数定数の値:125
8進整数定数の値:125
16進整数定数の値:125

変数に保存された後も、数値に10進、8進、16進という別々の見た目が保存されるわけではありません。

進数の違いは、ソースコード上で値をどのように表記するかという違いです。

2種類の浮動小数点定数を確認しよう

distanceは、小数点形式の浮動小数点定数2.75で初期化しています。

double distance = 2.75;

tiny_valueは、指数形式の浮動小数点定数4.5e-8で初期化しています。

double tiny_value = 4.5e-8;

tiny_valueは非常に小さな値なので、%eを使って指数形式で表示しています。

printf("指数形式の値:%e\n", tiny_value);

文字定数でchar型の変数を初期化する

symbolは、文字定数'B'で初期化しています。

char symbol = 'B';

printfでは%cを使って表示します。

printf("文字定数の値:%c\n", symbol);

実行結果にはBと表示されます。

文字列リテラルをprintfへ渡す

最後のprintfには、文字列リテラルを渡しています。

printf("文字列リテラル:%s\n", "定数の種類を確認しました");

%sの位置に、文字列リテラルの内容が表示されます。

文字列リテラルは複数の文字から構成されており、その末尾には文字列の終了を示すヌル文字\0があります。

定数を使うときの確認ポイント

整数、小数、文字、文字列をソースコードへ書くときは、次の点を確認しましょう。

  • 10進整数へ不要な先頭の0を付けていないか
  • 8進整数では0から7までの数字だけを使っているか
  • 16進整数の先頭に0xまたは0Xを付けているか
  • 小数には小数点形式または指数形式を使っているか
  • 文字定数を単一引用符で囲んでいるか
  • 文字列リテラルを二重引用符で囲んでいるか
  • 文字には%cを使っているか
  • 文字列には%sを使っているか
  • 浮動小数点数には誤差が生じる可能性を考えているか

よく使う基本形は、次の4つです。

123
3.14
'A'
"ABC"

これらを見たときに、整数定数、浮動小数点定数、文字定数、文字列リテラルのどれに当たるか判断できれば、変数の初期化や代入、printfによる表示を正しく組み立てやすくなります。