下記のプログラムは2つの整数の和を求めるプログラムです.
下記のプログラムを例にプログラミングの基本的な部分を解説します.
例1.1
#include <stdio.h>
int main(void)
文とブロック
変数の宣言
int a, b, c;
- 整数型(int 型)の変数a, b, c を宣言
プログラムを実行するとき,プログラムは計算機にいろいろな値をメモリに記憶させながら処理をしていきます.変数は値を記憶するための箱のようなものと考えてもよいかもしれません.この値にはいくつかの「種類」があります.値の種類は「データ型」または「型」と呼びます.例では,a, b, cの3つの変数が整数型であると宣言しています.
変数の宣言は,関数の始め(ブロックの先頭)に宣言し型名 変数名;
のように記述します.例のように,同じデータ型の変数をいくつも宣言する場合は
型名 変数名,変数名,・・・・・・,変数名;
のように変数名をカンマで区切って宣言することもできます.
それでは,次に,このデータ型と変数名について説明します.
C言語のデータ型には以下のような基本的なデータ型(基本型)があります.
- 文字型 char (文字 - 1バイト)
文字型は a や * などの1文字を表現するためのものです.
つぎのように1文字をシングルクォーテーションで囲んで表現します.
char c = 'a';
= は代入(文字列 a を変数 c に代入)を表す.
文字型は表1.1 のように文字コードを格納できる大きさが1バイトであることから,1バイトの整数型として扱うことができます.- 整数型 int (整数)
整数は1,2,-1,-2などの数で,小数部分をもたないものです.C言語では表現する数の大きさによって,表1.1のような種類の整数を宣言することができます.
- 浮動小数点型 float (単精度浮動小数点数)
double (倍精度浮動小数点数)
浮動小数点数型は0.00000123といった小数点以下の小さな数や,10の20乗といった大きな数を表現することができます.C言語では,表現する数の大きさによって,単精度と倍精度の2つの種類の浮動小数点を表現することができます.さらにこれらの基本形に修飾子: 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.1 のプログラムでは,int型の変数 a, b, c が宣言されています.
a, b, c が変数名であり,変数宣言を行うことにより a, b, cに対応するint型の記憶場所が用意されます.
変数名は以下の規則に従って付けなければなりません
- 最初の一文字は,英字かアンダースコア(_).
- 使える文字は,英字とアンダースコアと数字.
- 英大文字と英小文字は区別される.変数Aとaは別の変数として扱われます.
- 次に示すものは予約語と呼ばれていて,使い方が決められているので変数名として使用できません
予約語
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; のように)
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としています.
このような処理は変数の初期化(イニシャライザつきの変数宣言)といいます.
変数に,文字や整数や実数を入れる場合,直接,文字や数値を書くことができます.この文字や数値のことを定数といいます.定数はプログラムの実行中にその値を変えません.定数には以下の種類があります
- 整数定数
- 浮動小数点定数
- 文字定数
- 文字列定数
整数定数には10進,8進,16進定数があります.
10進定数 : 0以外の数字で始まる数字列です. 負の数を表現するときはマイナス(-)を数字の前に付ける.正の数を表現する場合には,通常プラス(+)をつけない.
例: 159, -209, 238進定数 : 数値を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を数字の後に付けます.
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文字を表現するもので,表現したい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 関数で頻繁に使います.
文字列表現は "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
下記のプログラムを実行したとき、どのような動作をするかを確認せよ。