定数


●定数

 定数とは,変数とは異なり,内容がずっと変化しない値のことである

  1. 定数の種類
    定数には以下の4種類がある。

    名前の無い定数 リテラル定数 値をそのまま書いたもの


     123
     1.2  1.  1.0  .1
     'A' "A" "ABC"

    名前を持つ定数 const定数 値の変化しない変数。
    変数宣言の前に const をつけ,うしろに初期値指定を付ける。


     const int i = 0;
     const char c1 = 'a';
     const double d = 0.1;

    列挙定数 整数値をつかってコード化を行うためのもの。
    実態は int型 の整数値。


     enum Country {
      America,
      Japan,
      UK,
      USA = 0
     };

    と定義しておけば,以降,
     America は 0
     Japan は 1
     UK は 2
     USA は 0
    として扱われる。

    マクロ定数 プリプロセッサにより,コンパイル前に書き換えられる


     #define PI 3.14159

    としてマクロ名 PI を定義しておけば,以降に書かれたこの
    マクロ名 PI はコンパイル直前に,3.14259 に書き換えられる。


    ここでは,最後の「マクロ定数」は後に回し,残りの3種類の定数について学ぼう。(「マクロ定数」については後日学習します。)



  2. リテラル定数

    リテラル定数とは,プログラム中に値をそのまま書き込んだものである。リテラル(literal)とは,「書いてあるままの」「書いてある通りの」という意味である。



    文字列リテラルは必ず必要になってくるが,できるだけ「名前付き定数」を使って,リテラル定数の使用は
    最低限にすること。




  3. const 定数

    参考:プリント「C言語のおさらい」8ページ
     初期値付きの変数宣言の前にというキーワードを付けると,その変数の値は
    指定された初期値に固定されて変更できなくなる。これを,const定数と呼ぶ。



    通常,定数を使うときは,この const 定数を使うと良い。
    cont定数を使うことで,プログラムが分かり易く,かつ変更しやすくなることをシューティングゲームの例で確認せよ




  4. 列挙定数

    参考:プリント「C言語のおさらい」8〜9ページ
     世の中では,「整数値・通し番号・記号の列」などを使って「何か」を表す事がよくある。
    これは主に「管理がしやすく」するためである。
    例えば
     ・学籍番号 … 「情報太郎」君は「E12000ab」
     ・出席番号 … 「環境花子」さんは出席番号「9」番
     ・車のナンバープレート … 「情報太郎所有の自動車」は「千葉553 と 8888」
     ・日本で出版されている本の出版コード … 「新版 明解C言語 入門編」は「ISBN978-4797327922」(いわゆるISBNコード)
     ・商品コード  …  「eneloop-ニッケル水素電池-1本パック」は「HR-1UTG-1BP」
     ・郵便番号 … 「千葉県千葉市若葉区御成台」は「265-0077」
     ・国が定める都道府県コード … 「北海道」は「01」,「青森県」は「02」,… ,「千葉県」は「12」,… ,「沖縄県」は「47」

    などなど。

    このように,「整数値・通し番号・記号の列」などを使って「何か」を表す
    ことを,「コード化」と呼ぶ。

    プログラムでも,「整数」を使って「コード化」を行うことがよくある。
    例えば
     ・文字コード(工業規格で決められてます)
       (1) ASCIIコード … 文字「5」は整数値「53」で表す,文字「A」は整数値「65」で表す,…,文字「z」は整数値「122」で表す。
       (2) SHIFT-JISコード … 文字「あ」は整数値「33440」で表す,文字「情」は整数値「36846」で表す。
     ・性別コード … 「男性」を「0」で表す,「女性」を「1」で表す。
     ・ゲームの敵味方の識別コード … 「味方である事」を「0」,「敵である事」を「1」で表す。

    など。

    こういった,「整数」を使った「コード化」は,const定数を使っても行うこと
    が出来る。

    例えば,性別をコード化する場合は,

    /* 参考)maleは男性,femaleは女性,genderは性別という意味の英単語。 */
    /* 定数名の最初の一文字の k は,定数を表すドイツ語 konstant の頭文字で,
    その名前が定数名で有る事を表したいときに付けることが多い。  */
      
    const int kMale   = 0; /* 男性を表す定数kMale   (値は整数値0) */
    const int kFemale = 1; /* 女性を表す定数kFemale (値は整数値1) */
      …
    int yourGender = kMale;
      …
    if( yourGender == kMale ) {
        /* 男性の場合の処理をここで行う */
        printf( "あなたは男性です。\n" );
    }
    else if( yourGender == kFemale ){
        /* 女性の場合の処理をここで行う */
        printf( "あなたは女性です。\n" );
    }
    else {
        printf( "性別が正しく設定されていません。\n" );
    }
    


    というように書けないことは無い。しかし,この性別の例のように2種類ならまだ
    簡単だが,数十種類以上になってくると const定数でコード化を行うことは大変に
    なってくる。

    そこで,C言語には「整数」を使った「コード化」に便利な,列挙型と列挙定数
    用意されている。列挙定数は,「定数を列べ挙げていく」形で定数を定義できる。

    列挙定数の基礎

    ※列挙定数名の前に k がついているが,これはドイツ語の定数を表す konstant に由来し,
     この名前が定数で有る事を示すのに良く用いられる命名法である。const定数の名前 にも
      使われることが有るが,列挙定数でもよく使われる。


    列挙型と列挙定数を使って,さきほどの性別の例を書き換えると以下の様になる。

        
    enum Gender {
        kMale,   /* 男性を表す定数kMale   (値は整数値0) */
        kFemale  /* 女性を表す定数kFemale (値は整数値1) */
    };
      …
    enum Gender yourGender = kMale;
      …
    if( yourGender == kMale ) {
        /* 男性の場合の処理をここで行う */
        printf( "あなたは男性です。\n" );
    }
    else if( yourGender == kFemale ){
        /* 女性の場合の処理をここで行う */
        printf( "あなたは女性です。\n" );
    }
    else {
        printf( "性別が正しく設定されていません。\n" );
    }
        
    
    列挙定数を使うことで,コード化を簡単に行え,プログラムが分かり易くなることをシューティングゲームの例で確認せよ