第2章の1 定数と変数

1. C言語のデータ

C言語で扱われるデータは大きく「定数」と「変数」に分けられます。

  • 定数: 値を変えないもの
  • 変数: 任意の値をとりうるもの

ということができます。

たとえば、a = 10; a = 20; では、a は「変数」、10 や 20 は「定数」になります。

「a = 10;」 は、a に 10 を代入するという意味になります。詳しくは「3-1. 代入演算子(=)」を参照してください。

2. 定数

代表的な定数は下記のように分類できます。

【代表的な定数】
数値定数 整数定数 8進数 先頭に「0」をつけて表記(077など)
10進数 通常の10進数と同じ表記
16進数 先頭に「0x」をつけて表記(0x41など)
浮動小数点定数 小数点以下が扱える数(16.25 や 1.0e-3 など)
文字定数 1文字のこと。’A’ や ‘B’ のように ‘ ‘ で囲んで表記
文字列定数 複数文字のこと。”ABC” や “computer”のように ” “で囲んで表記
  • 「浮動小数点数」とは浮動小数点表現方式の実数で、C言語では小数点以下の数を扱うときに用います。
  • 1.0e-3 は 1.0×10-3(0.001)のことです。C言語では浮動小数点数をこのようにも表記します。

3. 変数

(1) 変数の型

変数とはコンピュータのメモリ上に実際に用意された作業エリアです。

int data;

と記述すると、メモリ上に「data」という名前の整数を扱う 2バイトの作業エリアが用意されますし、

float data2;

記述すると、メモリ上に「data2」という名前の浮動小数点数を扱う 4バイトの作業エリアが用意されます。

C言語ではこの変数に、定数を代入したり、演算を行ったりしながら処理を進めていきます。 変数が、どのようにメモリ上で扱われるかは、こちらを参照してください。

プログラムを作成するとき、必要になる変数はすべてどういう作業エリアにするか使用する前に宣言しなければなりません。

以下に変数の主な型をまとめます。データ型の修飾については、第14章を参照してください。

【変数の主な型】
型指定 データ型 バイト幅 扱える数値の範囲
char 文字型 1 -128~127
short 短整数型 2 -32768~32767
int 整数型 4 -2147483648~2147483647
long 倍長整数型 4 -2147483648~2147483647
float 単精度浮動小数点型 4 3.4E-38~3.4E+38
double 倍精度浮動小数点型 8 1.7E-308~1.7E+308
  • バイト幅と扱える数値の範囲については各処理系によって異なります。
  • バイト幅と扱える数値の範囲については第13章で詳しく説明します。

(2) 変数の名付けルール

変数名を付けるには以下のようなルールがあります。 これは、関数記号定数でも同様となります。

  • 先頭の文字は英字(a~z、A~Z)または下線(_)でなければならない。
  • 2文字目以降は英字、下線、数字である。
  • 大文字と小文字を区別する。
  • 先頭から最低31文字までが有効である。
  • 予約語(C言語の文法上で使われる語)と同じ綴り(do、for など)は使用できないが、識別名の一部に入るのは可(dot、form など)。
  • ルールではありませんが、変数名はその変数を端的に表す名前を付けましょう。平均値を格納する変数名を単に「a」とするのと、「average」とするのとでは、プログラムの読みやすさが全然違います。
  • 下線(_)で始まる変数名は、C言語の処理系が予約識別子(処理系で使用する識別子)として用いている可能性があります。下線で始まる変数名はつけないようにしましょう。

(3) 変数の初期化

宣言時に値を代入することを初期化と呼びます。変数は宣言時に必要な値で初期化するか、宣言後に必要な値を代入しなければなりません。

宣言しただけでは、不定値(ゴミ)が入っているので、仮に初期値を 0 にしたい場合でも、きちんと

int a = 0;

のように初期化してください。

データの扱い方 サンプルプログラム

#include <stdio.h>

int main(void)
{
    char moji = 'H';         // mojiを文字型で宣言し、'H'で初期化
    int cnt = 5;             // cntを整数型で宣言し、5で初期化
    float x, y;              // xとyを単精度浮動小数点型で宣言
    double z;                // zを倍精度浮動小数点型で宣言

    x = 2.6f;                // xに2.6を代入(float型なので、接尾語fを追加)
    y = 3.8f;                // yに3.8を代入(float型なので、接尾語fを追加)

    z = x + y;               // x + yをzに代入

    long goukei;             // goukeiを倍長整数型で宣言
    goukei = 100 * cnt;      // 100 * cnt を goukeiに代入

    printf("moji = %c\n", moji);       // moji を出力
    printf("z = %f\n", z);             // z を出力
    printf("goukei = %ld\n", goukei);  // goukeiを出力

    return 0;
}
  • z と goukei は、計算値を代入するので初期化の必要はありません。

【実行結果例】
moji = H
z = 6.400000
goukei = 500

〇 演習問題

問1

コメントを参考に次のプログラムの空欄部を埋めて、プログラムを完成しなさい

#include <stdio.h>

int main(void)
{
    int a, b;
    double c, d;
    char e, f;
    char str[] = ______;   // 文字列定数 COMPUTER の設定

    a = ______;            // 10進定数 5 の設定
    b = ______;            // 16進定数 2fb の設定

    c = ______;            // 浮動小数点定数 3.14 の設定
    d = ______;            // 浮動小数点定数 2.548×10²(指数形式)の設定

    e = ______;            // 文字定数 A の設定
    f = ______;            // 文字定数 8 の設定

    printf("str = %s\n", str);
    printf("a = %d\n", a);
    printf("b = %x\n", b);
    printf("c = %f\n", c);
    printf("d = %e\n", d);
    printf("e = %c\n", e);
    printf("f = %c\n", f);

    return 0;
}

2.548×10² は、実際のコード中で上付き文字を使うわけではありません。
わかりやすくするために上付き文字を使っています。

【実行結果例】
str = COMPUTER
a = 5
b = 2fb
c = 3.140000
d = 2.548000e+02
e = A
f = 8

問2

コメントを参考に次のプログラムの空欄部を埋めて、プログラムを完成しなさい。

#include <stdio.h>

int main( void )
{
    ______;    // 変数 a と b を単精度浮動小数点型で宣言
    ______;    // 変数 c を倍精度浮動小数点型で宣言
    ______;    // 変数 seki を倍長整数型で宣言
    ______;    // 変数 i を単長整数型で宣言し、180で初期化
    ______;    // 変数 j を単長整数型で宣言し、500で初期化
    ______;    // 変数 ch を文字型で宣言し、文字定数 'S' で初期化
    
    a = 62.5;
    b = 23.3;
    
    c = a * b;
    seki = ( long )i * j;
    
    printf( "ch = %c\n ", ch );     // ch を出力
    printf( "c = %f\n", c );        // c を出力
    printf( "seki = %ld\n", seki ); // seki を出力
    
    return 0;
}

【実行結果例】
ch = S
c = 1456.249952
seki = 90000

解答例

【問1】

#include <stdio.h>

int main(void)
{
    int a, b;
    double c, d;
    char e, f;
    char str[] = "COMPUTER";   // 文字列定数 COMPUTER の設定

    a = 5;                     // 10進定数 5 の設定
    b = 0x2fb;                 // 16進定数 2fb の設定

    c = 3.14;                  // 浮動小数点定数 3.14 の設定
    d = 2.548e2;               // 浮動小数点定数 2.548×10²(指数形式)の設定

    e = 'A';                   // 文字定数 A の設定
    f = '8';                   // 文字定数 8 の設定

    printf("str = %s\n", str);
    printf("a = %d\n", a);
    printf("b = %x\n", b);
    printf("c = %f\n", c);
    printf("d = %e\n", d);
    printf("e = %c\n", e);
    printf("f = %c\n", f);

    return 0;
}

【問2】

#include <stdio.h>

int main(void)
{
    float a, b;            // 変数 a と b を単精度浮動小数点型で宣言
    double c;              // 変数 c を倍精度浮動小数点型で宣言
    long seki;             // 変数 seki を倍長整数型で宣言
    long i = 180;          // 変数 i を単長整数型で宣言し、180で初期化
    long j = 500;          // 変数 j を単長整数型で宣言し、500で初期化
    char ch = 'S';         // 変数 ch を文字型で宣言し、文字定数 'S' で初期化

    a = 62.5;
    b = 23.3;

    c = a * b;
    seki = (long)i * j;

    printf("ch = %c\n ", ch);       // ch を出力
    printf("c = %f\n", c);          // c を出力
    printf("seki = %ld\n", seki);   // seki を出力

    return 0;
}

● 補足:予約語

C言語では、次のものを予約語としています。予約語は識別子(変数名や関数名など)には使えません。

【予約語一覧】
auto break case char const continue default do double else enum extern float for goto if inline int long register restrict return short signed sizeof static struct switch typedef union unsigned void volatile while

_Alignas(※) _Alignof(※) _Atomic(※) _Bool _Complex
_Generic(※) _Imaginary _Noreturn(※) _Static_assert(※) _Thread_local(※)

※印が付いているものは、C11(2011年に策定されたC言語の規格)で追加された予約語です。C11では、従来のC言語にいくつかの機能が追加されており、これらの予約語もその一部です。

コメント