変数とデータ型

    2012/05/01

    本章では下記の内容を学習します。

    • 変数: 変数とは、数学での変数との違い
    • データ型: データ型とは、整数型・浮動小数点型・文字型
    • 変数の宣言: 宣言、代入、初期化
    • 変数の値の表示: printf 関数による変数値の表示

    変数

    変数とは

    例1-変数の表現
    #include <stdio.h>
    
    int main()
    {
        int  a, b, c;
    
        a = 10;
        b = 20;
        c = a + b;
    
        printf( "a=%d, b=%d, c=%d\n", a, b, c );
    
        return 0;
    }
    

    変数: variable とは、データを記憶するための領域です。より簡単に言えば、値を入れておくための箱です。

    プログラムの世界では、この変数を使って演算処理を行います。変数は名前の通り「変化する数値」であり、プログラマはアプリの状態に応じて変数を刻々と変化させることで、アプリの現在の状態を表現します。

    練習問題 : 生活の中の変数

    身の回りの世界のなかで、時間や状態に応じて刻々と変化するものは?

    数学での変数との違い

    例2-代入文
    int d, e;
    d = 10; // OK
    d = d + 4; // OK
    
    d + e = 55; // ダメ
    10 = e; // ダメ
    

    プログラムの世界では、a = 10; は「a に 10 を代入」になります。数学では「a と 10 は等しい」でしたので紛らわしいかもしれませんが、しっかり覚えてください。このような = を使った文を「代入文」と呼びます。

    代入文は、『左の変数に右の値を代入する』という働きをします。逆に書いた場合は意図した動作をしません。コンパイル時にエラーになることもありますが、そうでない場合は逆に気が付かないかもしれませんので注意してください。

    a = a + 5; という書き方も有効です。これは a に a+5 の結果を代入、という意味になります。つまり a を 5 増やすことになるわけです。このような自身に何かを足し引きするという代入文は、実践でも多く登場します。

    前回、プログラムはセミコロンで終端を表すとお教えしました。変数を書く場合においても、それは同じです。

    練習問題: 引き算
    1. x に 10, y に 7 を入れて、z に x - y をした結果が入るようにしてください
    2. その結果を printf で表示して報告してください

    変数への複数回の代入

    例3-複数回の代入
    #include <stdio.h>
    
    int main()
    {
      int i;
    
      i = 1;
      i = 10;
    
      // iの値はいくつ?
      printf( "i=%d\n", i );
    
      return  0;
    }
    

    変数に対して、複数回の代入操作を行った場合、その変数の値はどうなるでしょうか?

    例の場合、a の値は 10 になります。このように変数は最後に代入された値のみを保持します。もし変数に複数の値を保持させたい場合は、構造体やリストなどの、専用の仕組みをつかって覚えさせる必要があります。

    データ型

    データ型とは

    データ型: data type とは、変数がどのような値を表現するものかを表す型です。プログラムで利用するデータ型は、主に以下のように分類できます:

    • 整数型(int, short, long)
    • 浮動小数点型(float, double, long double)
    • 文字型(char, wchar_t)

    整数型

    例4-整数型
    #include <stdio.h>
    
    int main()
    {
      short a;
      unsigned int i;
    
      a = -10000;
      i = 123456;
    
      // 負数を含む場合は %d
      // unsignedの場合は %u で、それぞれ表示できる
      printf( "a=%d, i=%u\n", a, i );
    
      return  0;
    }
    

    整数型は、小数点を含まない数値を保存するためのデータ型です。整数型には、覚えておく数値の大きさによって、short, int, long の 3 つの型が用意されています。良く利用するデータ型は int です:

    bitunsignedsigned
    short160 ~ 65,535-32,768 ~ +32,767
    long32/640 ~ 約 42 億約-21 億 ~ 約 21 億
    long long640 ~ 約 1844 京約-922 京 ~ 約 922 京
    int320 ~ 約 42 億約-21 億 ~ 約 21 億

    (注意) 型の大きさは、プログラミングする環境によって、多少異なる場合があります。上記の例は Windows 32bit 環境における代表的な例になります

    整数型の場合、マイナスの値を考慮するかが選択できます。デフォルトではマイナスの値を考慮して、値の範囲の半分をマイナス側に割り当てます。たとえば short ならば、0 – 65,535 だったものが、-32,768 – +32,767 になります。このマイナス部分を考慮したくない場合、符号なし unsigned をデータ型の前に記述します。たとえば short ならば、unsigned short と記述します。

    練習問題: オーバーフロー

    short a; の変数に a = 100000; を入れると、どういう結果になりますか?

    浮動小数点型

    例5-浮動小数点型
    #include <stdio.h>
    
    int main()
    {
      float f;
      double d;
    
      f = 0.123456789012f;    // float型は、数字の末尾に f をつける
      d = 0.123456789012;     // double型は、とくに必要なし
    
      // 浮動小数点型は、いずれも %f で表示できる
      // %f の間に、M.N 形式で数字を指定すると、
      // M=全体の桁数、N=小数点以下の桁数、を指定できる
      printf( "f=%14.12f, d=%14.12f\n", f, d );
    
      return  0;
    }
    

    浮動小数点型は、小数点を含む数値を保存するためのデータ型です。浮動小数点型には、覚えておく数値の大きさによって、float, double, long double の 3 つの型が用意されています。良く利用する型は、float または double です:

    bit有効桁数
    float32おおよそ 7 桁
    double64おおよそ 15 桁

    浮動小数点型は、整数型より幅広い値を保持できます。ものすごく大きい値から、ものすごく小さい値まで覚える事ができますが、そのかわり有効桁数があります。たとえば float 型で 12300000000000 は有効桁数 3 桁なので覚える事ができますが、123456789.012 は桁数 12 なので正確に覚える事ができません(7 桁以降の細かい部分は捨てられる)。また、浮動小数点に unsigned はありません。

    練習問題: オーバーフロー

    例題の結果表示は、float と double で表示が異なっています。float の表示は何桁まで正しいですか?

    文字型

    #include <stdio.h>
    #include <locale.h> // 日本語対応
    
    int main()
    {
      char c = 'c'; // char 型は ' ' でくくって与える
      wchar_t w = L'あ'; // wchar_t 型の文字には、頭に L をつける
    
      // 日本語表示モードにする
      ::setlocale( 0, "JPN" );
    
      // char型は %c, wchar_t型は %C で表示できる
      printf( "%c %C\n", c, w );
    
      return  0;
    }
    

    文字型は、アルファベットや記号を 1 文字覚える事ができます。文字型には、覚えておくための文字の種類によって、char, wchar_t の 2 つの型が用意されています:

    bit有効桁数
    char8アルファベットまたは記号(半角文字)1 文字
    wchar_t16世界中のほぼすべての文字のうち 1 文字

    文字を覚えさせる際には、シングルクォートで挟んで教えます。たとえば、'a''#' などと記述します。char 型には半角文字を 1 つ、wchar_t 型には全角文字も含めて 1 つ覚えさせることができます。特に問題なければ char 型を利用しますが、最近のプログラミング環境では、wchar_t 型でしか文字のやり取りを行えない場合もありますので、随時対応していきます。

    変数の宣言

    宣言とは

    変数は、利用する前に宣言を行わなければなりません。たとえば int 型の a を宣言するには、以下のような文が必要になります:

    int  a;
    

    変数の宣言はブロック { } の最初で行う必要があります。また変数の名前に使える文字は英数字のみです。ただし変数名の頭文字に数字は使えません。int nNo; double _kion01; などは有効ですが、short 12nen; はエラーになります。

    さらに、C 言語ではプログラムに使う専用のキーワードがあり、それは 予約語 として変数名には使ってはいけないとされています。予約語には if, for, while, break などがあります。もし VisualC++でプログラムを書いていたときに、意図せずに文字が青くなったら、それは予約語ですから変数名としては使えません。

    練習問題: 変数の宣言
    1. 正しい名前、誤った名前での変数宣言を数個やってみましょう
    2. 予約語での変数宣言をしてみましょう

    一括宣言

    // 例 7: まとめて宣言
    int a, b, c;
    double d, e, f;
    

    同じ型の変数は、一度にまとめて宣言することができます。

    代入と初期化

    // 例 8: 初期化
    short a = 100;
    int i = 5, j, k = 255;
    

    変数に値を入れる事を 代入と呼びます。宣言と代入を一度に行うこともでき、これを初期化と呼びます。初期化は宣言が可能な個所でしか行うことができません:

    変数の値を表示

    printf 関数

    // 例 9: 変数の値を表示
    #include <stdio.h>
    
    int main( void )
    {
      int a, b;
    
      a = 10;
      b = 15;
    
      printf( "%d + %d = %d\n", a, b, a+b );
      return 0;
    };
    

    変数の値を表示してくれる仕組みとして printf 関数 があります。printf 関数には、表示したい文字列と表示したい変数を一度に指定することができます:

    printf( "プレイ回数は %d 回です\n", 123 );
    

    printf 関数の素晴らしい点は、%d の部分を、後ろに書いた値と置き替えて表示してくれるところです。上の例の場合、「プレイ回数は 123 回です」と表示されることになります。

    例 6 では、後ろに書く値の部分に、変数を与えています。さらに a, b, … と複数の変数を指定すれば、左から順に当てはめてくれます。a+b のように計算式を与えれば、その計算結果を当てはめてくれます。このように printf 関数を利用すれば、好きなタイミングで変数値を表示できるようになりますので、ぜひ使いこなしてください。

    実践問題 : 変数の操作と printf 関数

    以下のプログラムを作成してください:

    // 練習 2: プレイ回数とコイン枚数を表示
    #include <stdio.h>
    
    int main( void )
    {
      // プレイ回数は int 型で、変数名 play
      // コイン枚数は int 型で、変数名 coin
    
      // プレイ回数を0回に設定
      // コイン枚数を15枚に設定
    
      // プレイ回数とコイン枚数を表示
      // 『play=0, coin=15』と表示できればOK
      printf( "???", ???, ??? );
    
      // プレイ回数を1増やし、コイン枚数を3減らす
      // プレイ回数とコイン枚数を表示
    
      // プレイ回数を1増やし、コイン枚数を12増やす
      // プレイ回数とコイン枚数を表示
    
      // ◆最終的に『play=2, coin=24』と表示できればOK
    
      return 0;
    };