プログラミングを始めると、最初に必ず出てくるのが「変数」です。
変数は、データを一時的に保存しておくための箱のようなもので、C言語でプログラムを書くうえで欠かせない存在です。
本記事では、C言語の変数の宣言方法と使い方について、初心者の方にも分かりやすいように基礎から丁寧に解説していきます。
C言語の変数とは何か
変数とは
変数とは、値(データ)を一時的に保存しておくための「名前付きの領域」のことです。
コンピュータの中では、データはメモリという場所に保存されますが、メモリは単なる番号付きの部屋が並んでいるだけなので、そのままでは扱いづらいです。
そこで、C言語では変数に名前をつけて、その名前を通して値を読み書きできるようにしています。
たとえば、次のようなイメージです。
- 箱に「age」というラベルを貼る
- その箱に「20」という数字を入れる
- 必要になったら「age」という名前で中身を取り出す
この「ラベル付きの箱」が変数だと考えると理解しやすくなります。
なぜ変数が必要なのか
プログラムでは、ユーザーが入力した値を保存したり、計算結果を次の計算に使ったり、途中経過を一時的に保持したりする必要があります。
これらをすべて定数(決め打ちの値)だけで扱うのは現実的ではありません。
変数が必要になる典型的な理由として、次のようなものがあります。
- 入力された値を保持しておくため
- 複数回の計算で途中結果を保存するため
- 条件分岐や繰り返し処理の中で値を変化させるため
- 後から値を変更できるようにするため
たとえば、身長と体重からBMIを計算する場合、身長や体重、そして計算結果のBMIをそれぞれ変数に保存して扱うことになります。
変数があるからこそ、動的で柔軟なプログラムを作ることができます。
C言語における変数の基本ルール
C言語の変数には、いくつかの基本ルールがあります。
特に初心者の方が押さえておきたいポイントは次の通りです。
1つ目は、変数を使う前には必ず「宣言」しなければならないということです。
宣言とは、「こういう種類のデータを入れる変数を使います」とコンパイラに知らせる行為です。
2つ目は、変数には必ず「型」があることです。
型とは、その変数にどのような種類のデータを入れるかを表す情報です。
たとえば、整数なのか、小数なのか、文字なのか、といった違いを示します。
3つ目は、同じスコープの中で同じ名前の変数は2回宣言してはいけないという点です。
同じ名前を重ねて宣言するとコンパイルエラーになります。
最後に、変数名にはルールがあり、好き勝手な名前は付けられないということも重要です。
この点については後ほど詳しく説明します。
C言語の変数の宣言方法
変数宣言の基本構文と書き方
C言語で変数を宣言する基本的な書き方は、とてもシンプルです。
基本構文は次のようになります。
型 変数名;
たとえば、整数を入れる変数ageを宣言する場合は次のように書きます。
int age; // 年齢を保存するための整数型の変数ageを宣言
もう少し具体的な例として、整数と小数の変数を宣言して使うサンプルを見てみます。
#include <stdio.h>
int main(void) {
int age; // 整数型の変数ageを宣言
double height; // 実数(小数)型の変数heightを宣言
age = 20; // ageに20を代入
height = 170.5; // heightに170.5を代入
// 変数の値を表示
printf("年齢は%d歳です。\n", age);
printf("身長は%.1fcmです。\n", height);
return 0;
}
年齢は20歳です。
身長は170.5cmです。
このように、変数宣言は「型」と「変数名」をセットで書き、最後にセミコロン(;)を付けるというルールがあります。
よく使う基本データ型
C言語には多くのデータ型がありますが、初心者の段階で特によく使うのは次のものです。
| 型名 | 意味 | 例 |
|---|---|---|
int | 整数(小数点なしの数) | 0, 10, -3 |
double | 倍精度実数(小数点ありの数) | 3.14, -0.5, 100.0 |
float | 単精度実数(小数点ありの数) | 1.0f, -2.5f |
char | 1文字(文字コード1バイト分) | ‘A’, ‘0’, ‘\n’ |
特に、整数ならint、小数ならdoubleと覚えておくと良いです。
floatも小数を扱えますが、精度がdoubleより低いため、初心者のうちは小数はdoubleを使うと決めてしまっても問題ありません。
サンプルとして、これらの型をまとめて宣言し、内容を表示するプログラムを示します。
#include <stdio.h>
int main(void) {
int count; // 整数
double price; // 実数(倍精度)
float ratio; // 実数(単精度)
char initial; // 1文字
count = 5;
price = 1980.5;
ratio = 0.75f; // float型の定数にはfを付けるのが一般的
initial = 'A'; // 1文字はシングルクォートで囲む
printf("count = %d\n", count);
printf("price = %.2f\n", price);
printf("ratio = %.2f\n", ratio);
printf("initial = %c\n", initial);
return 0;
}
count = 5
price = 1980.50
ratio = 0.75
initial = A
このように、データの種類に応じて適切な型を選ぶことが、正しく安全なプログラムを書く第一歩となります。
変数名の付け方のルールと注意点
変数名には、C言語としてのルール(文法上の制約)と、読みやすさのためのマナーのようなものがあります。
ここでは特に重要なポイントに絞って説明します。
C言語の文法上のルールとして、次のような決まりがあります。
- 1文字目には、英字かアンダースコア
(_)だけが使える - 2文字目以降には、英字・数字・アンダースコア
(_)が使える intやreturnなどの予約語は変数名にできない- 大文字と小文字は区別される(例:cst-code>Ageと
ageは別の変数)
もう少し実際の例で見てみます。
- 有効な変数名の例
agetotalPrice_indexsum2
- 無効な変数名の例
2ndValue(先頭が数字なので不可)total-price(ハイフンは使えない)int(予約語)
次に、読みやすさのための注意点です。
- 変数名は意味のある名前にする
aやbだけでは何の値か分かりにくいため、ageやheightなど、内容が想像しやすい名前を使うと良いです。 - 単語をつなぐときはキャメルケースなどを使う
例として、total_priceやtotalPriceのように、複数の単語をつなげるルールを統一しておくと読みやすくなります。
このように、「コンパイラが受け付けるルール」と「人間が読みやすいルール」の両方を意識して変数名を付けることが大切です。
複数の変数をまとめて宣言する方法
同じ型の変数を複数宣言する場合、1つずつ書いても構いませんが、カンマで区切ってまとめて宣言することもできます。
たとえば、3つの整数a、b、cを宣言する場合、次の2つは同じ意味になります。
int a;
int b;
int c;
int a, b, c; // int型の変数a, b, cをまとめて宣言
また、宣言と同時に初期化(最初の値を入れること)もまとめて行うことができます。
#include <stdio.h>
int main(void) {
int x = 10, y = 20, z = 30; // 3つの変数をまとめて宣言と初期化
printf("x = %d, y = %d, z = %d\n", x, y, z);
return 0;
}
実行結果の例は次の通りです。
x = 10, y = 20, z = 30
ただし、異なる型の変数を1行で宣言することはできません。
その場合は、型ごとに分けて書く必要があります。
int count = 10;
double price = 98.5; // intとdoubleは別々に宣言する
このように、同じ型の変数だけをまとめるというルールを意識しておくと、エラーを防ぎやすくなります。
C言語の変数の使い方
代入とは
代入とは、変数に値を入れる(上書きする)操作のことです。
C言語では、代入に=を使います。
代入の基本構文は次の通りです。
変数名 = 式;
右側に書かれた「式」を計算し、その結果を左側の変数に保存します。
右辺は単なる値でも良いですし、計算式でも構いません。
#include <stdio.h>
int main(void) {
int a; // 整数型の変数aを宣言
int b; // 整数型の変数bを宣言
a = 10; // aに10を代入
b = a; // bにaの値(10)を代入
a = 20; // aの値を20に上書き
printf("a = %d\n", a);
printf("b = %d\n", b);
return 0;
}
a = 20
b = 10
この例から分かるように、代入は「右から左」へ値がコピーされる操作です。
b = a;を書いた時点で、bは10を持ち、その後aの値を変更してもbの値は変わりません。
変数を使った計算と式の書き方
変数は、計算式(式)の一部として利用できます。
たとえば、足し算や掛け算、割り算などでよく使われます。
よく使う演算子は次の通りです。
| 演算子 | 意味 | 例 |
|---|---|---|
+ | 足し算 | a + b |
- | 引き算 | a - b |
* | 掛け算 | a * b |
/ | 割り算 | a / b |
% | 剰余(あまり) | a % b |
実際のサンプルを見てみます。
#include <stdio.h>
int main(void) {
int a = 10;
int b = 3;
int sum; // 合計
int diff; // 差
int product; // 積
int quotient; // 商
int mod; // 余り
sum = a + b; // 10 + 3 = 13
diff = a - b; // 10 - 3 = 7
product = a * b; // 10 * 3 = 30
quotient = a / b; // 10 / 3 = 3 (整数同士の割り算)
mod = a % b; // 10 % 3 = 1 (余り)
printf("sum = %d\n", sum);
printf("diff = %d\n", diff);
printf("product = %d\n", product);
printf("quotient = %d\n", quotient);
printf("mod = %d\n", mod);
return 0;
}
sum = 13
diff = 7
product = 30
quotient = 3
mod = 1
ここで重要なのは、整数同士の割り算では小数点以下が切り捨てられるという点です。
小数の結果が欲しい場合は、double型などの実数型を使う必要があります。
#include <stdio.h>
int main(void) {
int a = 10;
int b = 3;
double result1;
double result2;
result1 = a / b; // 整数同士の割り算 → 3 となり、それがdoubleに入る
result2 = (double)a / b; // aをdoubleに変換してから割る → 3.3333... となる
printf("result1 = %f\n", result1);
printf("result2 = %f\n", result2);
return 0;
}
result1 = 3.000000
result2 = 3.333333
このように、変数の型が計算結果に影響することを意識しながらプログラムを書くことが大切です。
初期化
初期化とは、変数を宣言すると同時に最初の値を代入することです。
C言語では、ローカル変数(関数の中で宣言した変数)は自動では0になりません。
初期化しないと、中身が不定(ゴミ値)のままになり、予期しない動作の原因になります。
初期化の基本構文は次の通りです。
型 変数名 = 値;
具体的な例を示します。
#include <stdio.h>
int main(void) {
int a = 10; // 宣言と同時に10で初期化
double pi = 3.14; // 実数の初期化
char ch = 'A'; // 文字の初期化
printf("a = %d\n", a);
printf("pi = %f\n", pi);
printf("ch = %c\n", ch);
return 0;
}
a = 10
pi = 3.140000
ch = A
また、複数の変数を同時に初期化することもできます。
int x = 1, y = 2, z = 3;
初心者のうちは、ローカル変数を宣言したら必ず何か値で初期化するという習慣をつけると、バグを減らすことができます。
変数のスコープ
スコープとは、変数が有効な範囲(見える範囲)のことです。
C言語では、どこで宣言したかによって変数のスコープが決まります。
初心者の段階では、まず次の2種類を意識すると良いです。
1つ目は、ローカル変数です。
関数の中や{ }で囲まれたブロックの中で宣言された変数で、そのブロックの外からは見えません。
2つ目は、グローバル変数です。
関数の外で宣言した変数で、同じファイル内のどの関数からもアクセスできます(細かい条件はありますが、ここでは大まかなイメージとして押さえておけば十分です)。
ローカル変数のスコープを示す簡単な例を見てみます。
#include <stdio.h>
int main(void) {
int a = 10; // main関数の中で有効なローカル変数
if (a > 0) {
int b = 20; // if文のブロック内だけで有効
printf("a = %d, b = %d\n", a, b);
}
// ここでbは使えない(スコープ外)
// printf("%d\n", b); // ← これはコンパイルエラーになる
printf("a = %d\n", a); // aは引き続き使える
return 0;
}
a = 10, b = 20
a = 10
このように、変数は宣言したブロックの外では使えないというルールがあります。
「どこで宣言した変数なのか」を意識することで、スコープに関するエラーを減らすことができます。
実行の流れと変数の中身の変化を理解する
変数を正しく扱うには、プログラムが上から順番に実行され、その途中で変数の中身がどう変化していくかを意識することが大切です。
次のサンプルでは、計算の過程で変数がどのように変化するかを確認してみます。
#include <stdio.h>
int main(void) {
int x = 5; // 1. xを5で初期化
int y = 3; // 2. yを3で初期化
int z; // 3. zを宣言(まだ値は不定)
z = x + y; // 4. xとyを足した結果(8)をzに代入
x = z * 2; // 5. zの値(8)を2倍した結果(16)をxに代入
y = x - 4; // 6. xの値(16)から4を引いた結果(12)をyに代入
printf("x = %d\n", x);
printf("y = %d\n", y);
printf("z = %d\n", z);
return 0;
}
行ごとの変化を表にすると次のようになります。
| ステップ | 説明 | x | y | z |
|---|---|---|---|---|
| 初期 | まだ何もしていない | 不定 | 不定 | 不定 |
| 1 | x = 5 | 5 | 不定 | 不定 |
| 2 | y = 3 | 5 | 3 | 不定 |
| 3 | int z; | 5 | 3 | 不定 |
| 4 | z = x + y; | 5 | 3 | 8 |
| 5 | x = z * 2; | 16 | 3 | 8 |
| 6 | y = x - 4; | 16 | 12 | 8 |
x = 16
y = 12
z = 8
このように、「今この行を実行したら、各変数の中身はどうなっているか」を頭の中で追いかける練習をすると、バグの原因を見つけやすくなります。
紙に表を書きながら追ってみるのもおすすめです。
変数の宣言と使い方でよくあるエラーと防ぐコツ
宣言していない変数を使うエラー
初心者が最もよく遭遇するエラーの1つが、宣言していない変数を使ってしまうことです。
C言語では、宣言されていない名前は変数として扱えません。
次のコードを例に見てみます。
#include <stdio.h>
int main(void) {
int a = 10;
b = 20; // bを宣言していないのに使っている
printf("a = %d, b = %d\n", a, b);
return 0;
}
このプログラムをコンパイルすると、「未定義の識別子」などのエラーが出ます。
原因は、bを宣言していないことです。
正しい書き方は次のようになります。
#include <stdio.h>
int main(void) {
int a = 10;
int b = 20; // bを宣言してから使う
printf("a = %d, b = %d\n", a, b);
return 0;
}
このエラーを防ぐコツは、「新しい変数を使うときは、まず宣言を書いたかどうか確認する」という習慣をつけることです。
慣れるまでは、関数の先頭で使う全ての変数をまとめて宣言しておく方法も分かりやすいです。
型が合わない(型の不一致)エラー
C言語では、変数の型と代入する値の型が合わない場合、コンパイル時に警告やエラーが出ることがあります。
特に、intとdoubleの混在には注意が必要です。
次の例を見てみます。
#include <stdio.h>
int main(void) {
int a;
double b;
a = 3.14; // int型に小数を代入
b = 10; // double型に整数を代入
printf("a = %d\n", a);
printf("b = %f\n", b);
return 0;
}
このコードはコンパイル自体は通るケースもありますが、意図しない結果になる可能性があります。
a = 3.14;の行では、小数部分が切り捨てられてaには3が入ってしまいます。
正しくは、型に合った値を代入することです。
#include <stdio.h>
int main(void) {
int a;
double b;
a = 3; // int型には整数を代入
b = 3.14; // double型には小数を代入
printf("a = %d\n", a);
printf("b = %f\n", b);
return 0;
}
このエラーや警告を防ぐコツとしては、次の点を意識すると良いです。
- 整数は
int、小数はdoubleと決めておく - 計算の結果が小数になる場合は、変数も
doubleにする - コンパイラの警告は無視せず、内容を確認する
警告を「動くからいいや」と放置すると、後で見つけにくいバグの原因になります。
初心者のうちから、警告は0にする意識を持つと良いです。
初期化忘れによる予期しない動作
先ほども少し触れましたが、C言語ではローカル変数は自動的には0になりません。
宣言しただけで初期化しないと、「不定の値」が入ったままになります。
この状態で計算や表示を行うと、毎回違う値が出たり、おかしな結果になったりします。
例を見てみます。
#include <stdio.h>
int main(void) {
int sum; // 初期化していない
sum = sum + 10; // 不定の値に10を足している
printf("sum = %d\n", sum);
return 0;
}
このプログラムはコンパイルできますが、実行するとsumには予測不能な値が入ります。
毎回実行結果が変わることもあり、とても危険です。
正しくは、次のように必ず初期化してから使う必要があります。
#include <stdio.h>
int main(void) {
int sum = 0; // 0で初期化
sum = sum + 10;
printf("sum = %d\n", sum);
return 0;
}
このエラーを防ぐコツは非常にシンプルで、変数を宣言したらすぐに適切な初期値を入れることです。
特に、0から積み上げていく合計値などは、最初に0を入れておくのが定石です。
変数名のつけ間違いとタイポを防ぐポイント
変数名をタイプミスしてしまい、本来とは別の変数を使ってしまうというミスもよくあります。
C言語は大文字小文字を区別するため、sumとSumは別の変数として扱われます。
次の例を見てみます。
#include <stdio.h>
int main(void) {
int totalPrice = 1000;
// ここで変数名を打ち間違えている
printf("合計金額は%d円です。\n", totalprice);
return 0;
}
この場合、totalpriceという変数は宣言されていないため、コンパイルエラーになります。
これはまだ分かりやすいケースです。
もっと厄介なのは、タイポした名前の変数を別途宣言してしまう場合です。
#include <stdio.h>
int main(void) {
int totalPrice = 1000;
int totalprice = 0; // 似た名前の別の変数を宣言してしまった
printf("合計金額は%d円です。\n", totalprice);
return 0;
}
この場合、コンパイルは通りますが、表示されるのはtotalPriceではなくtotalpriceの値(0)になってしまいます。
このようなバグは気づきにくく、デバッグに時間がかかります。
こうしたミスを防ぐためのポイントとして、次のような工夫が有効です。
- 似た名前の変数を多用しない
例として、totalとtotal2など、区別がつきにくい名前を避けると良いです。 - 変数名の付け方をプロジェクト内で統一する
例えば、すべて小文字で単語間はアンダースコア_にする、などルールを決めておくとブレが減ります。 - コンパイラの警告を活用する
未使用の変数がある場合、コンパイラが警告を出してくれることがあります。「宣言したのに使っていない変数」があれば、それはタイポなどのヒントかもしれません。 - 小さなプログラムでもこまめにコンパイル・実行する
変数を追加するたびにコンパイルしてエラーを確認すれば、問題が起きた場所をすぐに特定できます。
このように、変数名は「プログラムの読みやすさ」と「ミスの少なさ」に直結するため、慎重に扱うことが重要です。
まとめ
本記事では、C言語初心者の方に向けて、変数の宣言と使い方について基礎から丁寧に解説しました。
まず、変数とは値を保存しておくための名前付きの領域であり、ユーザー入力や計算結果など、プログラム中のあらゆるデータを扱うために不可欠であることを説明しました。
そのうえで、型と変数名をセットで宣言するという基本構文や、int、double、charなどの代表的なデータ型、そして変数名の付け方のルールと注意点を確認しました。
次に、代入や計算式への利用、初期化、スコープといった、変数を実際に使う場面で必ず知っておくべきポイントを具体例を交えながら紹介しました。
実行の流れに沿って変数の値がどのように変化するかを追いかけることで、プログラムの理解が深まることもお伝えしました。
最後に、よくあるエラーとその防ぎ方として、宣言忘れ、型の不一致、初期化忘れ、変数名のタイポなどを取り上げました。
これらは初心者がつまずきやすいポイントですが、原因と対処法を知っておけば、落ち着いて修正できるようになります。
C言語のプログラムは、「適切な型の変数を宣言し、正しく初期化し、スコープを意識しながら使う」という基本さえ押さえれば、ぐっと書きやすく理解しやすくなります。
本記事の内容を参考にしながら、実際に自分で小さなプログラムを書いて、変数の動きやエラーの原因を体感してみてください。
それが、C言語を身につける一番の近道です。
