1. 変数と変数型

下記のプログラムは2つの整数の和を求めるプログラムです.
下記のプログラムを例にプログラミングの基本的な部分を解説します.


例1.1


#include <stdio.h> 

int main(void)

文とブロック

変数の宣言

int a, b, c;

プログラムを実行するとき,プログラムは計算機にいろいろな値をメモリに記憶させながら処理をしていきます.変数は値を記憶するための箱のようなものと考えてもよいかもしれません.この値にはいくつかの「種類」があります.値の種類は「データ型」または「型」と呼びます.例では,a, b, cの3つの変数が整数型であると宣言しています.
変数の宣言は,関数の始め(ブロックの先頭)に宣言し

型名 変数名;

のように記述します.例のように,同じデータ型の変数をいくつも宣言する場合は

型名 変数名,変数名,・・・・・・,変数名;

のように変数名をカンマで区切って宣言することもできます.
それでは,次に,このデータ型と変数名について説明します.

1.1 データ型

C言語のデータ型には以下のような基本的なデータ型(基本型)があります.

さらにこれらの基本形に修飾子: short, long, signed(符号付き), unsigned(符号なし)
を付けることにより記憶できる値の範囲が変わります.
表1.1 はC言語での主な基本型の例です.

表1.1 C言語での主な基本型の例
種類 名前 サイズ例 記憶できる値の範囲例
文字型 char 1バイト -128〜127

unsigned char 1バイト 0〜255
整数型 short int 2バイト -32768〜32767

int 4バイト -2147483648〜2147483647

long int 4バイト -2147483648〜2147483647

unsigned short int 2バイト 0〜65535

unsigned int 4バイト 0〜4294967295

unsigned long int 4バイト 0〜4294967295
浮動小数点型 float 4バイト 3.4E-38〜3.4E+38

double 8バイト 1.7E-308〜1.7E+308
long double 8バイト 1.7E-308〜1.7E+308
(注意) サイズ例と記憶できる値の範囲例は処理系によって異なる.ここでは目安として考えてください.
short int, unsigned short int, long int, unsigend long int は通常 int を省いて
short, unsinged short, long, unsigned long のように書かれる.

1.2 変数名

例1.1 のプログラムでは,int型の変数 a, b, c が宣言されています.
a, b, c が変数名であり,変数宣言を行うことにより a, b, cに対応するint型の記憶場所が用意されます.
変数名は以下の規則に従って付けなければなりません

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

一つの文で複数の変数を宣言するときは,同じような用途の変数をまとめて宣言します.(int a, b, c; のように)

1.3 変数に値を代入

a = 5;
b = 12:
c = a + b;
整数型の変数 a, b, c の対応する記憶場所に5, 12, aとbの和が書き込まれます.
言い換えれば,変数a, b, c にそれぞれ 5, 12, a+b を代入するということになります.
= の記号は,数学式で使われるような等しいという意味ではありません.
値を代入するという機能をあらわすものです.= は代入演算子と呼ばれます.
変数の初期化
変数を宣言したときに同時に,変数に値を格納することもできます.これは変数の宣言時に,
int a = 5, b = 12;
のように記述することでa, bの整数型を宣言し,それぞれの初期値を5, 12としています.
このような処理は変数の初期化(イニシャライザつきの変数宣言)といいます.

1.4 定数

変数に,文字や整数や実数を入れる場合,直接,文字や数値を書くことができます.この文字や数値のことを定数といいます.定数はプログラムの実行中にその値を変えません.定数には以下の種類があります

1.4.1 整数定数

整数定数には10進,8進,16進定数があります.

10進定数 : 0以外の数字で始まる数字列です. 負の数を表現するときはマイナス(-)を数字の前に付ける.正の数を表現する場合には,通常プラス(+)をつけない.
例: 159, -209, 23

8進定数 : 数値を8進数で表現するためのもので,使用できる数字は0〜7.数字の一番前に 0(ゼロ)を付ける.
例: 014 (8進数で14(10進数で12)を表している).

16進定数 : 数値を16進数で表現するためのもので,使用できる数字と文字は 0〜9, a〜f, A〜F.数字の前に 0x または 0X(ゼロエックス)を付ける.
例: 0xc, 0xC, 0Xc, 0XC (すべて16進数でC(10進数で12)を表している)

long型の指定 : 上記の定数において数字の後に L または l を付けることによりlong型を明示的に指定することができます.
例: 159L, 014l, 0xCL

この他にも,符号なし定数は数字の後に u または U を付けて書きます. unsigned long を表すのには ul または ULを数字の後に付けます.

1.4.2 浮動小数点定数

3.14, -0.013 のように小数点を含む定数でdouble型として扱われます.
0.123e-5, 0.123E-5 (0.123×10-5)のような指数表現も可能.仮数部の数値と指数部の数値をEでつなぐ.なお,仮数部と指数部の数値は10進数表現で指定します.
.75, .75e-2のように整数部を省略することもできます.

実際の値
3.14 3.14
0.123e-5 0.123×10-5
2.24E12 2.24×1012
.75 0.75
.75E-2 0.75×10-2

これらの定数はdouble型ですが,数字の後に F または f を付けるとfloat定数, L または l をつけるとlong doubleとして扱われます.

1.4.3 文字定数

1文字を表現するもので,表現したい1文字を 'a' (小文字のaを表現している) のようにシングルクォーテーションで囲んで書きます.
また,文字の中にはキーボードから入力できない特殊な文字があります.このような文字については「\」を最初に付けた2つの文字の組み合わせで「1文字分」を表すことができます.これをエスケープシーケンスと呼びます.エスケープシーケンスを表1.2に示します

エスケープシーケンス 意味
\a 警告音(アラート)
\b 1文字分戻る(バックスペース)
\f 改ページ(フォームフィールド)
\n 改行(ニューライン)
\r 復帰,同じ行の先頭に戻る(キャリッジリターン)
\t 水平タブ
\v 垂直タブ
\\ \記号そのものを表す(バックスラッシュ)
\' シングルクォーテーション
\" ダブルクォーテーション
\? ?を表す
\ooo 8進数oooのASCII文字コード(*)をもつ文字
\xhh 16進数hhのASCII文字コード(*)をもつ文字

ASCII文字コード表は各自で調べておくように.
文字定数 '\0' は値 0 をもつ文字であるヌル文字(ヌルコード)としてよく使われます.
また,改行 '\n' は後で述べる printf 関数で頻繁に使います.

1.4.4 文字列定数

文字列表現は "C language" のように,文字列をダブルクォーテーションで囲んで表現します.文字列の終わりを示すためのヌルコード(\0)が文字列の最後に自動的に付加されます.
前回習った

printf("Hello, world!\n");

でもこの文字列表現が使われています.この文字列定数(文字列リテラル)はコンパイル時に連結することができます.
"hello," " world\n" は,"hello, world\n"と同じになります.これを使うと printf("Hello, world!\n");の文は下のように

printf("Hello,"
       " world!\n");

と書くことができます.

練習問題1.1

下図のような文字列を出力するプログラムを作成せよ。

練習問題1.2

下記のプログラムを実行したとき、どのような動作をするかを確認せよ。