言語
日本語
English

Caution

お使いのブラウザはJavaScriptが無効になっております。
当サイトでは検索などの処理にJavaScriptを使用しています。
より快適にご利用頂くため、JavaScriptを有効にしたうえで当サイトを閲覧することをお勧めいたします。

Pascal辞典

  1. トップページ
  2. Pascal辞典
  3. const / var

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);定数の値に組み込み関数の結果を使えます。HighLow などの定数式を使用できます。

サンプルコード

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 セクションの変数は beginend の実行ブロック内で値を代入・変更できます。型付き定数(const 名前 : 型 = 値;)は Free Pascal では再代入が可能ですが、通常の定数として扱うのが一般的です。type セクションを使った型定義については TYPE 宣言(型定義) を、列挙型については 列挙型(Enumeration) を合わせて確認してください。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。