🇯🇵 日本語 | 🇺🇸 English

第3回 変数

C言語の変数とは?int, double, charの使い方を図解で解説。

📖 このページで覚えること
✅ 最低限ここだけ覚える
  • int は整数、double は実数、char は1文字
  • 宣言: int x; 代入: x = 5;
  • = は「等しい」ではなく「代入」
  • 使う前に必ず初期化 (int x = 0;)
⭐ 余裕があれば読む
  • 型のサイズは処理系依存(典型値を覚える)
  • 整数 ÷ 整数 は切り捨てになる罠
  • オーバーフローは符号付きだと未定義動作
🎬
この講座を動画で見る(約8分)
スライド解説 + 音声ナレーション

変数とは ― データを記録する領域に名前をつけたもの

変数とは、データを記録しておく領域に固有の名前をつけたものです。
変数名:領域の名前 / 変数の値:格納されているデータ
必要なときに変数名を指定して、記録したデータにアクセスできます。
変数 a
?
+
変数 b
?
=
変数 c
?

変数の記録領域 ― コンピュータの内部

パソコンの主な部品は3つ。変数の箱はメモリの中に作られます。
🧠
CPU
計算・処理する
「頭脳」
変数はココ
📦
メモリ (RAM)
実行中のデータを
一時的に置く作業場
💾
ストレージ
ファイルを永続保存
(SSD / HDD)
メモリの中のイメージ(変数の箱が並んでいる)
5
x
3.14
pi
'A'
g
空き
プログラムが終わるとメモリは解放 → 変数も消える。ファイルに残すのとは違います。

メモリの内部 ― ビット(0/1)の世界

メモリは {0, 1} の値を保存するビットの連続です。変数の値は連続する数ビットに記録され、変数名はその領域に名前をつけます。
メモリ上の int seisu = 5; の表現 (32ビット)

変数の種類 ― 「型」がある

変数には型があり、型ごとにメモリ上に確保される箱の数(バイト数)が異なります。
整数型 int
例: -2, -1, 0, 1, 2, 3, ...
小数点以下は計算されない
典型的には 4バイト(処理系により異なる)
int seisu = 5;
実数型 double
例: 1.2, -2.68, 3.14, 79.69, ...
小数を含む計算に使用
典型的には 8バイト(IEEE 754 倍精度)
double jissu = 3.14;

型のサイズ比較(典型値)

char (1B)
int (4B)
float (4B)
double (8B)
重要: C言語の規格は「int は少なくとも 16bit、long は少なくとも 32bit」などと下限のみを定めており、実際のサイズは処理系(コンパイラ+環境)に依存します。上のサイズは現在の多くのデスクトップ/Linux/macOS/gcc での典型値にすぎません。自分の環境で確認するには sizeof(int)%zu で printf してください。

型は「箱の形」で選ぶ

どの型を使うかは入れたい値で決まります。迷ったら以下のフローチャート:
① 小数を使う?
 → はい: doublefloat より精度が高い)
 → いいえ: ②へ
② 文字を扱う? (1文字だけ)
 → はい: char
 → いいえ: ③へ
③ 整数を使う
 → 約21億 (±2,147,483,647) まで: int(ほぼ常にこれ)
 → もっと大きい: long long
用途の例範囲の目安
int個数、インデックス、点数32bit環境で 約 -21億 〜 +21億
long long人口、秒数、大きなID最低 64bit、約 ±9.2 × 1018
double身長、平均、確率、座標IEEE 754 なら 15〜17桁の有効数字
char1文字 ('A'、'あ' はNG)通常 -128 〜 127(※ 符号は処理系依存)
unsigned intマイナスが出ないサイズ値32bit環境で 0 〜 約42億
初学者の鉄則: 迷ったら 整数は int、小数は double。float や short、long を自分から選ぶ必要はほぼありません。

初学者がハマる「型」の罠

罠1: 整数÷整数 は切り捨て

これはC言語入門者が最初に必ずハマる罠です。
int a = 7;
int b = 2;
double r = a / b;      // rは 3.0 になる! (3.5ではない)
printf("%f\n", r);   // → 3.000000
なぜ? int 同士の割り算は int の結果になるから。7/2 はまず int として 3 と計算され、その後 double に変換される。
// 正しく 3.5 にするには片方を double に
double r = (double)a / b;   // → 3.5
// または最初から double で宣言
double a = 7, b = 2;
double r = a / b;                  // → 3.5

罠2: int の上限を超える(オーバーフロー)

32bit int は約 ±21億までしか表現できません。日本の人口は入るが、世界の人口は入らない。
int big = 2000000000;   // 20億
big = big + 2000000000;       // 40億...になるはず
printf("%d\n", big);       // 結果は未定義 (実機ではしばしば負の値が出る)
重要: C言語の規格では、符号付き整数のオーバーフローは「未定義動作 (undefined behavior)」です。「うまく壊れて負の値になる」と暗記してはいけません。コンパイラはこれが起きない前提で最適化することがあり、予測不可能な結果(ループが消える、プログラムが異常動作する等)になり得ます。
参考: unsigned 型のオーバーフローだけは「2の冪で折り返す」と規格で明確に定義されています。
安全側に倒すには: ① long long%lld)を使って範囲を広げる、 ② INT_MAX<limits.h>)と比較して事前にチェックする、 ③ -fsanitize=undefined で gcc/clang にランタイム検出させる、のいずれか。

罠3: 書式指定子の型ミス

printf の書式と変数の型を合わせないと、画面に変な値が出たり未定義動作になります。
書式
int%dprintf("%d", 42);
double%f or %lfprintf("%f", 3.14);
char%cprintf("%c", 'A');
char * (文字列)%sprintf("%s", "hello");
long long%lldprintf("%lld", 9000000000LL);

罠4: 初期化していない変数

int x;               // 宣言のみ。中身は不定
printf("%d\n", x);  // → ゴミ値(毎回違うことも)

// 正しくは:
int x = 0;           // 0 で初期化
必ず初期化する習慣を: Cは「使う前に値を保証する」言語ではない。自動でゼロにしてくれるPythonなどと違う。

罠5: 変数名のルール

宣言・代入・上書き

変数を使うには、まず宣言してメモリに領域を確保し、代入で値を格納します。
int seisu;       // 宣言:メモリに変数の領域を確保
seisu = 5;       // 代入:値を格納 ( = は「等号」ではなく「代入」!)
注意: = は等号ではなく代入です!右辺の値を左辺の変数に格納します。
宣言していない変数に代入するとエラー: x = 23; → 「xってどこ???」

上書きの仕組み

変数に新たな値を代入すると、前の値は上書きされて消えます。同じ領域に記憶できる情報は一つだけ。
変数 seisu

別の変数の値を代入

x = y; とすると、yの値がxにコピーされます(yの値は変わりません)。
変数 x
10
変数 y
33

ステップ実行 ― 変数の変化を追う

variable_demo.c

変数の状態

変数名

標準出力

 

自分で書いてみよう ― 変数

my_vars.c
出力
「実行」を押してください...
💡 こんなことも試してみよう

関連する講座

入門編
第4回 printf・scanf
C言語のprintf関数とscanf関数の使い方。書式指定子を一覧で解説。
演算子編
第8回 算術演算子
C言語の算術演算子(+, -, *, /, %)を図解で解説。整数除算の注意点も。
演算子編
第10回 代入・インクリメント
C言語の代入演算子とインクリメント(++)・デクリメント(--)を解説。
← 前の講座
第2回 Hello World
次の講座 →
第4回 printf・scanf

確認クイズ

この講座の理解度をチェックしましょう!

Q1. int 型の変数に格納できるのは?

小数
整数
文字列

int 型は整数を格納します。小数には float や double、文字列には char 配列を使います。

Q2. 次のうち、正しい変数名はどれ?

2value
my_var
int

変数名は英字またはアンダースコアで始める必要があります。数字で始まる名前や予約語(int など)は使えません。

Q3. double 型と float 型の違いは?

double の方が精度が高い
float の方が精度が高い
違いはない

double は倍精度浮動小数点数(約15桁)、float は単精度(約7桁)です。通常は double を使うことが多いです。

この記事をシェア
X(Twitter)でシェア Facebookでシェア LINEで送る はてブ

この講座の理解を深めるおすすめ書籍

サイトで動きを理解し、書籍で演習量を補うと効果的です

📘
苦しんで覚えるC言語
MMGames 著
初心者向けの定番入門書。丁寧な解説で基礎を固められます。
Amazonで見る
📗
新・明解C言語 入門編
柴田望洋 著
図解が豊富で、演習問題も充実。大学の教科書としても採用多数。
Amazonで見る
📙
プログラミング言語C 第2版
B.W.カーニハン, D.M.リッチー 著
通称K&R。C言語の原典。基礎を終えた後のステップアップに最適。
Amazonで見る

※ 上記リンクはアフィリエイトリンクです。購入によりサイト運営を支援いただけます。