C言語の基本|変数の宣言と名前の付け方

変数はデータを預ける名前付きの箱。宣言と命名の基本を覚えて、意味の伝わるコードを書こう。

前の記事では、C言語で扱うデータにはintやdoubleなどの種類があることを学びました。

ここからは、そのデータをプログラムの中へ保存するために欠かせない変数について、もう少し詳しく見ていきます。

変数は、数値や文字などのデータを一時的に保存するための入れ物です。たとえば、年齢、点数、人数、温度、評価などをプログラムの中で使いたいときに、それぞれの値を変数へ保存します。

ただし、C言語では、変数をいきなり使うことはできません。

先に、どのような種類のデータを保存するのか、どのような名前で使うのかを指定する必要があります。この準備が変数の宣言です。

このパートでは、次の内容を中心に学びます。

  • 変数がどのような役割を持つのか
  • 変数を宣言する基本的な書き方
  • データ型によって変数の大きさが変わること
  • sizeofで変数の大きさを調べる方法
  • 同じ型の変数をまとめて宣言する方法
  • 変数を宣言できる場所
  • 変数名として使える識別子のルール
  • 意味が伝わる変数名の付け方

変数の宣言と名前の付け方が分かると、scanfで値を入力するコードやprintfで値を表示するコードも、読みやすく整理できるようになります。

変数はデータを保存する入れ物

変数は、プログラムで使用するデータを保存するための場所です。

日常生活で考えると、名前を書いた箱や引き出しに物を入れておく感覚に近いものです。

たとえば、次のような変数を用意したとします。

int age;
int score;
double temperature;
char grade;

それぞれの変数には、異なる役割があります。

変数名保存するデータデータ型
age年齢int
score点数int
temperature温度double
grade評価を表す1文字char

ageとscoreは整数を保存するため、int型です。

temperatureは小数を含む値を保存するため、double型です。

gradeはAやBなどの1文字を保存するため、char型です。

変数には名前が付いているため、プログラムの中で保存した値を後から指定して使えます。

int score;

score = 85;

printf("点数は%d点です。\n", score);

このコードでは、scoreという変数へ85を保存し、その値をprintfで表示しています。

変数を宣言するとメモリに領域が用意される

プログラムで変数を宣言すると、その変数が使用する領域がメモリ上に用意されます。

たとえば、次の宣言では、整数を保存するための領域が用意されます。

int score;

次の宣言では、小数を保存するための領域が用意されます。

double temperature;

必要なメモリの大きさは、変数のデータ型によって異なります。

int、double、charは、保存するデータの種類が違うため、それぞれが使用するメモリの大きさも同じとは限りません。

変数を宣言する基本的な書き方

C言語で変数を宣言するときは、データ型と変数名を順番に書き、最後にセミコロンを付けます。

データ型 変数名;

実際の宣言は、次のようになります。

int number;
double temperature;
char letter;

それぞれの意味は次のとおりです。

宣言意味
int number;int型のnumberという変数を宣言する
double temperature;double型のtemperatureという変数を宣言する
char letter;char型のletterという変数を宣言する

宣言には、次の3つの要素があります。

要素役割
データ型変数へ保存するデータの種類を決める
変数名プログラムから変数を指定するための名前
セミコロン変数宣言の終わりを表す

セミコロンを付け忘れると、コンパイルエラーになります。

int number

正しくは、文末にセミコロンを付けます。

int number;

宣言と代入は別の操作

変数を用意することが宣言、変数へ値を保存することが代入です。

int score;
score = 85;

1行目では、int型のscoreを宣言しています。

2行目では、scoreへ85を代入しています。

処理コード内容
宣言int score;scoreという変数を用意する
代入score = 85;scoreへ85を保存する

変数を宣言しただけでは、表示に使える値が自動的に設定されるとは限りません。

特に関数内で宣言した自動変数を初期化せず、その値を読み取ると、正しい結果は保証されません。

int score;

printf("%d\n", score);

このような使い方は避け、値を使う前に必ず代入するか、宣言と同時に初期化しましょう。

int score = 85;

宣言と同時に初期値を設定できる

変数の宣言と同時に、最初の値を設定できます。

int score = 85;
double temperature = 24.5;
char grade = 'A';

変数へ最初の値を設定することを初期化と呼びます。

変数データ型初期値
scoreint85
temperaturedouble24.5
gradecharA

最初から保存する値が決まっている場合は、宣言と同時に初期化すると、変数の役割と最初の状態が分かりやすくなります。

図1:変数を宣言するとメモリに箱が用意される

この図から分かること

変数を宣言すると、その変数が値を保存するための領域がメモリ上に用意されます。

データ型は、変数へ保存する値の種類を決めます。変数名は、用意した領域をプログラムから指定するための名前です。

変数を宣言する基本の形は、次のとおりです。

データ型 変数名;

int、double、charでは扱うデータが異なるため、使用するメモリの大きさも異なる場合があります。

sizeofで変数の大きさを調べる

変数やデータ型が何バイトのメモリを使用するかは、sizeof演算子で確認できます。

変数の大きさを調べる場合は、次のように書きます。

sizeof(変数名)

たとえば、scoreの大きさは次のように調べられます。

sizeof(score)

データ型そのものの大きさを調べることもできます。

sizeof(int)

sizeofの結果は、バイト単位で表されます。

sizeofの結果は%zuで表示する

sizeofが返す値の型はsize_tです。printfでsize_t型の値を表示するときは、%zuを使用します。

printf("%zu\n", sizeof(score));

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

書き方役割
sizeof(score)scoreの大きさをバイト単位で調べる
sizeof(int)int型の大きさをバイト単位で調べる
%zusizeofの結果をprintfで表示する

sizeofの詳しい仕組みは、配列やポインタを学ぶときにも登場します。今は、変数や型が使用するバイト数を調べられる演算子として理解しておけば大丈夫です。

変数の大きさを確認するプログラム

次のプログラムでは、商品数、価格、分類記号を表す3つの変数を宣言し、それぞれの大きさをsizeofで調べます。

商品データを表す変数の大きさを調べるプログラム

ファイル名:4_2_1.c

// 商品データを表す変数の大きさを調べるプログラム
#include <stdio.h>

int main(void)
{
    int item_count;       // 商品の個数
    double item_price;    // 商品の価格
    char category;        // 商品の分類記号

    printf("変数の大きさを調べます。\n");
    printf("int型の変数item_countの大きさは%zuバイトです。\n",
           sizeof(item_count));
    printf("double型の変数item_priceの大きさは%zuバイトです。\n",
           sizeof(item_price));
    printf("char型の変数categoryの大きさは%zuバイトです。\n",
           sizeof(category));

    return 0;
}
実行結果の例

Windows 11と一般的な64ビット版GCCの組み合わせでは、次のような結果になることがあります。

変数の大きさを調べます。
int型の変数item_countの大きさは4バイトです。
double型の変数item_priceの大きさは8バイトです。
char型の変数categoryの大きさは1バイトです。

データ型の大きさは処理系によって異なる場合があります。そのため、すべての環境で必ず同じ実行結果になるとは限りません。

ただし、C言語ではsizeof(char)は常に1です。ここでいう1バイトが何ビットで構成されるかは、処理系によって異なる可能性があります。

3つの変数宣言を確認しよう

最初に、int型のitem_countを宣言しています。

int item_count;

item_countは、商品の個数を保存するための変数です。商品の個数は整数で表せるため、int型を使用しています。

次に、double型のitem_priceを宣言しています。

double item_price;

item_priceは、商品の価格を保存するための変数です。小数を含む値も扱えるようにdouble型を使用しています。

最後に、char型のcategoryを宣言しています。

char category;

categoryは、AやBなどの商品分類を表す1文字を保存する変数です。

sizeofへ変数名を渡して大きさを調べる

次の処理では、item_countが使用するメモリの大きさを調べています。

sizeof(item_count)

結果はprintfの%zuへ渡されます。

printf("int型の変数item_countの大きさは%zuバイトです。\n",
       sizeof(item_count));

item_priceとcategoryについても、同じ方法で大きさを表示しています。

このプログラムでは変数へ値を代入していませんが、sizeofで変数の大きさを調べるだけなので、変数に保存されている値を読み取っているわけではありません。

同じ型の変数はまとめて宣言できる

同じデータ型の変数は、カンマで区切って1行にまとめて宣言できます。

int width, height;

この宣言は、次のように1つずつ書いた場合と同じ意味です。

int width;
int height;

char型の変数を3つまとめて宣言する場合は、次のように書きます。

char grade_a, grade_b, grade_c;

1つずつ書くと、次のようになります。

char grade_a;
char grade_b;
char grade_c;

どちらの書き方でも、用意される変数は同じです。

まとめて宣言する利点と注意点

変数をまとめて宣言すると、同じ型の変数を短く書けます。

int width, height;

関連する少数の変数を並べる場合は、すっきりとした書き方になります。

一方、多数の変数を1行へ並べると、変数の役割が分かりにくくなります。

int a, b, c, d, e, f, g, h, i, j;

文法上は書けますが、それぞれの変数が何を表しているのか分かりにくくなっています。

変数が多い場合は、役割ごとに分けたり、1行ずつ宣言したりすると読みやすくなります。

int student_count;
int teacher_count;
int classroom_count;

学習中は、短く書くことよりも、変数の意味を確認しやすい書き方を優先するとよいでしょう。

同じ型の変数をまとめて宣言するプログラム

次のプログラムでは、2つのint型変数と3つのchar型変数を、カンマで区切って宣言します。

複数の測定用変数をまとめて宣言するプログラム

ファイル名:4_2_2.c

// 複数の測定用変数をまとめて宣言するプログラム
#include <stdio.h>

int main(void)
{
    int room_width, room_height;          // 部屋の幅と高さ
    char point_a, point_b, point_c;        // 3つの測定地点

    printf("まとめて宣言した変数の大きさを調べます。\n");

    printf("room_widthの大きさは%zuバイトです。\n",
           sizeof(room_width));
    printf("room_heightの大きさは%zuバイトです。\n",
           sizeof(room_height));

    printf("point_aの大きさは%zuバイトです。\n",
           sizeof(point_a));
    printf("point_bの大きさは%zuバイトです。\n",
           sizeof(point_b));
    printf("point_cの大きさは%zuバイトです。\n",
           sizeof(point_c));

    return 0;
}
実行結果の例
まとめて宣言した変数の大きさを調べます。
room_widthの大きさは4バイトです。
room_heightの大きさは4バイトです。
point_aの大きさは1バイトです。
point_bの大きさは1バイトです。
point_cの大きさは1バイトです。

この実行結果は、Windows 11と一般的な64ビット版GCCを使った場合の一例です。

int型の2つの変数をまとめて宣言する

次の1行では、room_widthとroom_heightを宣言しています。

int room_width, room_height;

データ型のintは先頭に1回だけ書かれていますが、room_widthとroom_heightの両方がint型になります。

この書き方は、次の2行と同じ意味です。

int room_width;
int room_height;

どちらも部屋の寸法を表す関連した変数なので、まとめて宣言しても意味を理解しやすくなっています。

char型の3つの変数をまとめて宣言する

次の1行では、point_a、point_b、point_cをchar型として宣言しています。

char point_a, point_b, point_c;

3つの変数は、それぞれ別の変数です。まとめて宣言しても、1つの領域を共有するわけではありません。

sizeof(point_a)
sizeof(point_b)
sizeof(point_c)

それぞれにsizeofを使用でき、個別の変数として扱えます。

変数を宣言できる場所

古いC言語では、変数の宣言をブロックの先頭へまとめて書く必要がありました。

C99以降では、変数を使用する前であれば、処理の途中でも宣言できます。C17を基準に学習している場合も、この書き方を利用できます。

printf("処理を開始します。\n");

int count = 10;

printf("countの大きさは%zuバイトです。\n", sizeof(count));

printfの後にcountを宣言していますが、C17では正しい書き方です。

ただし、変数を宣言する位置には、それぞれ読みやすさの違いがあります。

宣言する位置特徴
関数やブロックの先頭付近使用する変数をまとめて確認しやすい
変数を使う場所の近く変数の役割や使用範囲を把握しやすい

学習を始めたばかりの段階では、main関数の先頭付近に変数をまとめると、プログラム全体を確認しやすくなります。

慣れてきたら、変数を最初に使用する場所の近くで宣言する方法も使ってみましょう。

変数名は識別子の一種

C言語では、変数などに付ける名前を識別子と呼びます。

識別子は、変数名だけを指す言葉ではありません。次のような名前にも識別子が使われます。

  • 変数の名前
  • 関数の名前
  • 配列の名前
  • 構造体などの名前
  • マクロの名前

ここでは、変数名として使用する識別子のルールを確認します。

識別子に使える文字

基本的な変数名には、次の文字を使用できます。

  • 半角の英大文字AからZ
  • 半角の英小文字aからz
  • 半角数字0から9
  • アンダースコア_

ただし、先頭に使用できる文字と、2文字目以降に使用できる文字には違いがあります。

位置使用できる文字
先頭英字またはアンダースコア
2文字目以降英字、数字、アンダースコア

たとえば、次の変数名は使用できます。

int age;
int age2;
int student_count;
double average_score;
char gradeA;

次の変数名は、先頭が数字なので使用できません。

int 2age;

数字は2文字目以降であれば使用できます。

int age2;
int score2026;

図2:変数名として使える名前と使えない名前

この図から分かること

変数名の先頭には、英字またはアンダースコアを使用します。数字を使いたい場合は、2文字目以降に置きます。

変数名には、ハイフンや空白を使用できません。また、forなどの予約語も変数名にはできません。

文法上使える名前であっても、内容が分かりにくければ、読みやすいコードにはなりません。識別子のルールを守ったうえで、変数の役割が伝わる名前を付けることが大切です。

変数名に空白は使えない

複数の英単語を使った変数名に、空白を入れることはできません。

次の書き方は正しくありません。

int student count;

studentとcountが別々の要素として解釈されるため、1つの変数名にはなりません。

複数の英単語を組み合わせる場合は、アンダースコアなどを使います。

int student_count;

キャメルケースを使う方法もあります。

int studentCount;

どちらもC言語の識別子として使用できます。

ハイフンは変数名に使えない

次の変数名には、ハイフンが含まれています。

int total-score;

C言語では、ハイフンは減算演算子として使われます。そのため、変数名の一部にはできません。

複数の単語を区切る場合は、ハイフンではなくアンダースコアを使用します。

int total_score;

大文字と小文字は区別される

C言語では、大文字と小文字を別の文字として扱います。

int number;
int Number;

numberとNumberは、別の変数です。

次の3つも、C言語ではすべて異なる識別子です。

int score;
int Score;
int SCORE;

文法上は同じプログラム内で使えますが、見た目が似ているため、取り違えやすくなります。

初心者のうちは、次のように役割の違いが分かる名前を付けるのがおすすめです。

int current_score;
int target_score;
int highest_score;
変数名表す内容
current_score現在の点数
target_score目標の点数
highest_score最高点

大文字と小文字だけで変数の意味を分けるよりも、英単語を加えて役割を明確にしたほうが読みやすくなります。

予約語は変数名に使えない

C言語には、文法上の意味があらかじめ決められている単語があります。このような単語を予約語やキーワードと呼びます。

代表的な予約語には、次のようなものがあります。

予約語主な役割
int整数型を表す
char文字型を表す
double浮動小数点型を表す
return関数から値を返す
if条件分岐を行う
for繰り返し処理を行う
while条件に基づく繰り返しを行う
dodo while文で使用する

予約語にはC言語としての役割があるため、変数名には使用できません。

次の宣言は正しくありません。

int int;
int return;
int for;

一方、予約語の文字を一部に含んでいても、名前全体が予約語と一致しなければ使用できます。

int integer_count;
int return_value;
int format_number;

formはforと似ていますが、同じ単語ではないため使用できます。

int form;

dotもdoを含んでいますが、予約語のdoとは別の名前です。

int dot;

アンダースコアで始まる名前の注意点

変数名は、文法上アンダースコアから始めることもできます。

int _count;

ただし、C言語ではアンダースコアから始まる識別子の一部が、処理系や標準ライブラリのために予約されています。

特に、次のような名前は自分の変数名として使わないようにしましょう。

  • アンダースコアに続いて大文字がある名前
  • アンダースコアが2つ連続する名前
  • ファイル全体で使うアンダースコア始まりの名前

たとえば、次のような名前は避けます。

int _Count;
int __count;

初心者のうちは、変数名を英小文字から始めると安全です。

int count;
int student_count;
int total_score;

文法上正しい名前と読みやすい名前は違う

識別子のルールを守っていれば、次のような短い変数名も使用できます。

int a;
double b;
char c;

しかし、この3つの変数が何を表しているのかは、名前だけでは分かりません。

次のように書くと、保存するデータの意味が伝わりやすくなります。

int student_count;
double average_score;
char evaluation;

違いを整理すると、次のようになります。

分かりにくい名前分かりやすい名前表している内容
astudent_count学生の人数
baverage_score点数の平均
cevaluation評価を表す文字

変数名は、コンパイラだけでなく人が読むものでもあります。少し長くなっても、意味が伝わる名前を選ぶことが大切です。

意味の分かる英単語を使う

変数名には、保存する値を表す英単語を使うと分かりやすくなります。

日本語の意味英単語の例
年齢age
点数score
個数count
合計total
平均average
最大maximum、max
最小minimum、min
width
高さheight
温度temperature
日数days
時間hours

たとえば、点数の合計は次のように表せます。

int total_score;

学生の人数は、次のように表せます。

int student_count;

平均温度は、次のように表せます。

double average_temperature;

最初から多くの英単語を覚える必要はありません。学習でよく使う単語から、少しずつ増やしていけば大丈夫です。

複数の英単語をつなぐ方法

変数名に複数の英単語を使う場合は、主にアンダースコア形式かキャメルケースを使用します。

アンダースコアで単語をつなぐ

int student_count;
double average_score;
int maximum_value;

この書き方は、スネークケースとも呼ばれます。単語の区切りが見やすいため、C言語でもよく使われます。

2つ目以降の単語を大文字で始める

int studentCount;
double averageScore;
int maximumValue;

この書き方は、キャメルケースと呼ばれます。

どちらもC言語の文法として使用できます。

形式
アンダースコア形式average_score
キャメルケースaverageScore

大切なのは、1つのプログラムやプロジェクトの中で書き方をそろえることです。

学習中は単語の区切りを確認しやすいアンダースコア形式を使うと、読みやすく感じることが多いでしょう。

変数名を略しすぎない

変数名を短くするために、英単語を省略することがあります。

たとえば、averageをavg、numberをnumと書く方法があります。

double avg_score;
int student_num;

このような省略はよく使われますが、慣れていない人には意味が伝わりにくい場合があります。

学習中は、無理に短くせず、意味を読み取れる名前を優先するとよいでしょう。

double average_score;
int student_number;

ただし、繰り返し処理で使うiなど、役割が広く理解されている短い名前もあります。変数名の長さだけで良し悪しを決めるのではなく、その場面で意味が伝わるかを考えることが大切です。

図3:意味が伝わる変数名を作る流れ

この図から分かること

変数名は、思いついた文字を付けるのではなく、保存するデータの意味から考えると決めやすくなります。

最初に整数、小数、文字のどれを扱うか考えてデータ型を選びます。次に、保存する内容を表す英単語を組み合わせて変数名を作ります。

文法上のルールを守るだけでなく、後から読んだ人が役割を理解できる名前にすることが大切です。

宣言と命名のポイントをプログラムで確認しよう

次のプログラムでは、イベント運営で使用するデータを表す変数を宣言します。

それぞれの変数には、保存する内容が分かる名前を付けています。

イベント情報を表す変数を宣言するプログラム

ファイル名:4_2_3.c

// イベント情報を表す変数を宣言するプログラム
#include <stdio.h>

int main(void)
{
    int event_days;             // イベントの開催日数
    int visitor_count;          // 来場者数
    double average_stay_hours;  // 平均滞在時間
    char event_rank;            // イベントの評価ランク

    printf("宣言した変数の大きさを表示します。\n");
    printf("event_daysの大きさ:%zuバイト\n",
           sizeof(event_days));
    printf("visitor_countの大きさ:%zuバイト\n",
           sizeof(visitor_count));
    printf("average_stay_hoursの大きさ:%zuバイト\n",
           sizeof(average_stay_hours));
    printf("event_rankの大きさ:%zuバイト\n",
           sizeof(event_rank));

    return 0;
}
実行結果の例
宣言した変数の大きさを表示します。
event_daysの大きさ:4バイト
visitor_countの大きさ:4バイト
average_stay_hoursの大きさ:8バイト
event_rankの大きさ:1バイト

この実行結果は、Windows 11と一般的な64ビット版GCCを使った場合の一例です。データ型の大きさは、使用する処理系によって異なる可能性があります。

event_daysの宣言を確認しよう

event_daysは、イベントの開催日数を表しています。

int event_days;

日数は整数で扱えるため、int型を選んでいます。

変数名には、イベントを表すeventと、日数を表すdaysを使用しています。2つの単語をアンダースコアでつなぐことで、単語の区切りが分かりやすくなっています。

visitor_countの宣言を確認しよう

visitor_countは、イベントの来場者数を表しています。

int visitor_count;

来場者数も整数なので、int型です。

countだけでも個数を表せますが、visitor_countとすることで、何を数えているのかが明確になっています。

average_stay_hoursの宣言を確認しよう

average_stay_hoursは、来場者の平均滞在時間を表しています。

double average_stay_hours;

平均滞在時間は小数を含む可能性があるため、double型を使用しています。

average、stay、hoursという3つの単語を組み合わせています。少し長い変数名ですが、何を表しているのかを名前から理解できます。

event_rankの宣言を確認しよう

event_rankは、イベントの評価ランクを1文字で表す変数です。

char event_rank;

AやBなどの1文字を保存する想定なので、char型を選んでいます。

rankだけでも評価を表せますが、event_rankとすることで、イベントに関する評価であることが明確になります。

変数名とコメントを組み合わせる

分かりやすい変数名を付けても、コメントが不要になるとは限りません。

double average_stay_hours;  // 平均滞在時間

average_stay_hoursという名前から、おおよその意味は分かります。コメントを付けることで、日本語による確認もできます。

ただし、変数名とコメントの内容が同じことを繰り返すだけでは、情報が増えない場合もあります。

必要に応じて、コメントへ単位や条件を加えると、さらに役立ちます。

double average_stay_hours;  // 来場者1人あたりの平均滞在時間

コメントは、変数名だけでは伝えにくい情報を補うために使うと効果的です。

作業フォルダーを用意する

4章のソースファイルを整理する場合は、C:\cworkの下へchap04フォルダーを作成すると分かりやすくなります。

作業フォルダーの例は次のとおりです。

C:\cwork\chap04

この中へ、今回作成したファイルを保存します。

C:\cwork\chap04\4_2_1.c
C:\cwork\chap04\4_2_2.c
C:\cwork\chap04\4_2_3.c

コマンドプロンプトで作業フォルダーへ移動する場合は、次のように入力します。

cd \cwork\chap04

日本語が文字化けするときは文字コードを確認する

コマンドプロンプトを起動し直した場合は、必要に応じてコードページをUTF-8へ変更します。

chcp 65001

VS Code側では、ソースファイルをUTF-8で保存します。

日本語が正しく表示されない場合は、次の点を確認しましょう。

  • VS CodeでソースファイルをUTF-8として保存しているか
  • コマンドプロンプトでchcp 65001を実行したか
  • 変更したソースファイルを再コンパイルしたか
  • 日本語を表示できるフォントを使用しているか

4_2_1.cをC17としてコンパイルする場合は、次のように入力します。

gcc -std=c17 4_2_1.c -o 4_2_1

コンパイル後は、次のように実行します。

4_2_1

変数を自分で宣言するときは、まず保存したいデータの種類を考えてデータ型を選び、その後に役割が伝わる変数名を付けてみましょう。

型名、変数名、セミコロンという宣言の形に慣れ、識別子のルールを守って名前を付けられるようになれば、次に学ぶ代入や計算でも、変数を迷わず使えるようになります。