const / var
『Pascal』では定数と変数の宣言をそれぞれ専用のセクションで行います。const セクションは値が変わらない定数を、var セクションは実行中に値が変わる変数を宣言するためのものです。両セクションは program 宣言の直後、begin より前に記述します。定数を const で宣言しておくと、マジックナンバーの埋め込みを避けてコードの意図を明確に伝えられます。
構文
{ -----------------------------------------------
const セクション:値が変わらない定数を宣言します
----------------------------------------------- }
const
定数名 = 値; { 型は値から自動推論されます }
定数名 : 型名 = 値; { 型付き定数(typed constant) }
{ -----------------------------------------------
var セクション:実行中に変わる変数を宣言します
----------------------------------------------- }
var
変数名 : 型名; { 宣言のみ(初期値は不定)}
変数名 : 型名 = 初期値; { 宣言と同時に初期値を設定 }
変数名1, 変数名2 : 型名; { 同じ型を複数まとめて宣言 }
{ -----------------------------------------------
記述順序(program 直後、begin より前)
----------------------------------------------- }
program プログラム名;
const
定数1 = 値;
定数2 = 値;
var
変数1 : 型名;
変数2 : 型名;
begin
{ 処理 }
end.
構文一覧
| 構文 | 概要 |
|---|---|
const 定数名 = 値; | 型なし定数を宣言します。型はコンパイラが値から自動推論します。プログラム全体で変更不可です。 |
const 定数名 : 型名 = 値; | 型付き定数(typed constant)を宣言します。Free Pascal では型付き定数への再代入が可能ですが、通常の定数としての使い方が推奨されます。 |
var 変数名 : 型名; | 変数を宣言します。初期値は設定されないため、begin ブロック内で代入してから使います。 |
var 変数名 : 型名 = 初期値; | 変数を初期値付きで宣言します。宣言と同時に値を設定できます。 |
var 変数名1, 変数名2 : 型名; | 同じ型の変数を1行にまとめて宣言します。 |
const MAX = High(Integer); | 定数の値に組み込み関数の結果を使えます。High・Low などの定数式を使用できます。 |
サンプルコード
kof_const_var.pas
{ kof_const_var.pas — Pascal の const / var セクションを確認するサンプルです }
{ KOF(THE KING OF FIGHTERS)のキャラクターデータを使って }
{ 定数と変数の宣言・参照・変更を試します }
{
コンパイルと実行:
fpc kof_const_var.pas && ./kof_const_var
}
program kof_const_var;
const
{ -----------------------------------------------
型なし定数:マジックナンバーに名前を付けます
----------------------------------------------- }
MAX_POWER = 9999; { 戦闘力の上限 }
MIN_POWER = 0; { 戦闘力の下限 }
TEAM_SIZE = 3; { チーム人数 }
GAME_TITLE = 'KOF'; { ゲームタイトル略称 }
{ -----------------------------------------------
型付き定数:型を明示した定数です
----------------------------------------------- }
BASE_BONUS : Integer = 500; { 基本ボーナス値 }
VERSION : Real = 2.0; { データバージョン }
var
{ -----------------------------------------------
変数:実行中に値が変わるデータを宣言します
----------------------------------------------- }
fighter_name : string; { 現在のファイター名 }
power : Integer; { 現在の戦闘力 }
is_champion : Boolean; { チャンピオンフラグ }
win_count : Integer; { 勝利数 }
i : Integer; { ループカウンタ }
begin
{ -----------------------------------------------
変数への代入(定数を使って意図を明確にします)
----------------------------------------------- }
fighter_name := 'Kyo Kusanagi';
power := 9850;
is_champion := True;
win_count := 0;
{ -----------------------------------------------
定数を参照して範囲チェックします
----------------------------------------------- }
WriteLn('===== ', GAME_TITLE, ' 戦闘データ(v', VERSION:3:1, ') =====');
WriteLn('ファイター : ', fighter_name);
WriteLn('戦闘力 : ', power, ' / ', MAX_POWER);
if power > MAX_POWER then begin
WriteLn(' ※ 戦闘力が上限を超えています');
end else begin
WriteLn(' ※ 戦闘力は正常範囲内です');
end;
WriteLn('チャンピオン: ', is_champion);
{ -----------------------------------------------
定数を使ったループ(TEAM_SIZE 回繰り返します)
----------------------------------------------- }
WriteLn('');
WriteLn('--- ', TEAM_SIZE, ' 回の対戦シミュレーション ---');
for i := 1 to TEAM_SIZE do begin
win_count := win_count + 1;
power := power + BASE_BONUS; { 勝利ごとに戦闘力を加算 }
if power > MAX_POWER then begin
power := MAX_POWER; { 上限を超えたらクランプします }
end;
WriteLn(' 第', i, '戦 勝利 → 戦闘力: ', power);
end;
{ -----------------------------------------------
最終結果を表示します
----------------------------------------------- }
WriteLn('');
WriteLn('通算勝利数 : ', win_count);
WriteLn('最終戦闘力 : ', power);
WriteLn('==========================================');
end.
fpc kof_const_var.pas && ./kof_const_var Free Pascal Compiler version ... Linking ./kof_const_var ===== KOF 戦闘データ(v2.0) ===== ファイター : Kyo Kusanagi 戦闘力 : 9850 / 9999 ※ 戦闘力は正常範囲内です チャンピオン: TRUE --- 3 回の対戦シミュレーション --- 第1戦 勝利 → 戦闘力: 9999 第2戦 勝利 → 戦闘力: 9999 第3戦 勝利 → 戦闘力: 9999 通算勝利数 : 3 最終戦闘力 : 9999 ==========================================
kof_typed_const.pas
program kof_typed_const;
{$J+} { 型付き定数への代入を許可します(FPC デフォルトは禁止) }
const
MAX_LEVEL = 10; { 型なし定数:変更不可 }
BASE_POWER : Integer = 3000; { 型付き定数:{$J+} で変更可 }
FIGHTER_NAME : string = 'Terry Bogard'; { 型付き定数:文字列 }
var
level : Integer;
begin
WriteLn('=== KOF 型付き定数デモ ===');
WriteLn('初期戦闘力 : ', BASE_POWER);
WriteLn('初期名前 : ', FIGHTER_NAME);
{ 型付き定数は {$J+} があれば再代入できます }
BASE_POWER := BASE_POWER + 1000;
FIGHTER_NAME := 'Kyo Kusanagi';
WriteLn('変更後戦闘力: ', BASE_POWER);
WriteLn('変更後名前 : ', FIGHTER_NAME);
WriteLn('最大レベル : ', MAX_LEVEL, '(型なし定数・変更不可)');
end.
fpc kof_typed_const.pas && ./kof_typed_const Free Pascal Compiler version ... Linking ./kof_typed_const === KOF 型付き定数デモ === 初期戦闘力 : 3000 初期名前 : Terry Bogard 変更後戦闘力: 4000 変更後名前 : Kyo Kusanagi 最大レベル : 10(型なし定数・変更不可)
kof_multi_var.pas
program kof_multi_var;
var
{ 複数の変数をまとめて宣言します }
name1, name2, name3 : string;
hp1, hp2, hp3 : Integer;
is_active : Boolean;
{ 初期値付き宣言 }
round_number : Integer = 1;
game_title : string = 'KOF';
begin
{ 使用前に必ず代入します }
name1 := 'Kyo Kusanagi';
name2 := 'Iori Yagami';
name3 := 'Terry Bogard';
hp1 := 100;
hp2 := 100;
hp3 := 85;
is_active := True;
WriteLn('=== ', game_title, ' ラウンド ', round_number, ' ===');
WriteLn(name1, ' HP: ', hp1);
WriteLn(name2, ' HP: ', hp2);
WriteLn(name3, ' HP: ', hp3);
WriteLn('試合中: ', is_active);
end.
fpc kof_multi_var.pas && ./kof_multi_var Free Pascal Compiler version ... Linking ./kof_multi_var === KOF ラウンド 1 === Kyo Kusanagi HP: 100 Iori Yagami HP: 100 Terry Bogard HP: 85 試合中: TRUE
よくあるミス
未初期化のvar変数を使う
Pascal の var 変数はグローバルスコープではゼロ初期化されますが、ローカルスコープ(プロシージャ・関数内)では未初期化のままになります。使用前に必ず代入してください。
procedure ShowPower;
var
power : Integer; { ローカル変数:初期値は不定です }
begin
{ power := 0; を省くと不定値が表示されます }
power := 5000;
WriteLn('戦闘力: ', power);
end;
型付き定数と真の定数の混同
const x: Integer = 0; は型付き定数で、{$J+}(FPC)を指定すると変更できます。const x = 0; は真の定数でコンパイル時に値が確定し、変更できません。用途に応じて使い分けます。
const
TRUE_CONST = 100; { 真の定数:変更不可 }
TYPED_CONST : Integer = 100; { 型付き定数:{$J+} で変更可 }
{ TRUE_CONST := 200; } { コンパイルエラー }
{ TYPED_CONST := 200; } { {$J+} があれば OK、なければエラー }
概要
『Pascal』の const セクションと var セクションは、プログラムの宣言部(begin より前)に配置します。const で宣言した型なし定数はコンパイル時に値が確定し、プログラム中で変更できません。マジックナンバーを const に切り出すことで、値の意味をコード上で明示でき、変更箇所を一箇所にまとめられます。var セクションの変数は begin〜end の実行ブロック内で値を代入・変更できます。型付き定数(const 名前 : 型 = 値;)は Free Pascal では再代入が可能ですが、通常の定数として扱うのが一般的です。type セクションを使った型定義については TYPE 宣言(型定義) を、列挙型については 列挙型(Enumeration) を合わせて確認してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。