2.
変数
変数
・*:..☆ プロローグ ☆..:*・
「シンデレラ、あなたをお城の舞踏会に連れていってあげるわ。それにはいろいろと用意がいるのよ。えーと、まずは服からね。
あなた、服は何着持っているの?
2着?...そう。今着ているのは...ちょっとタグを見せて...ああ、これは駄目ね。定数服だから。もう一着のは...ああ良かった、変数服よ。タグに"cx"って書いてあるでしょ。
世の中のすべての物は定数か変数のどちらかなのよ。変数だったら他のものに変えられるの。何にでも、ってわけじゃないんだけどね。
じゃあ、これをドレスに変えてっと。さあ着替えなさい。
靴は...これでいいわね。左が"sl"で右が"sr"。ガラスの靴にしましょうか。
次は馬車ね。そこのかぼちゃを取って..."px"って書いてあるやつ...そうそう、それよ。これを馬車に変えましょう。えい!
馬も必要ね。そこのネズミでいいわ。"a1"と"a2"。"a3"は御者にしましょう。
これで全部そろったわね。
それでね、12時になったら元に戻すようにプログラムしておくから注意してね。お義姉さんたちにバレると面倒でしょ。
"a1"と"a2"と"a3"、"px"、あとは"cx"と"sl"ね。」
ほとんどのプログラミング言語は“変数”を使用します。変数とは、変化させる値に名前を付けたものです。
整数の 999 は、どんな場合にも 999 です。このような値を定数と呼びます。
これに対し変数 x は、999 であったり、-534 であったり、0 であったりします。値を格納する名前付きの入れ物と考えても良いでしょう。
数学で使用する変数をイメージしてかまいませんが、あくまでもプログラミング言語の変数ですから、多少の違和感があるかもしれません。
2.1. 定数
定数 変数の説明の前に、定数について簡単に説明します。
プログラム・コードに 123 と記述すると、それは整数の定数として扱われます。
123 の記述は 10 進数として解釈され、値 123 を表します。定数なので値が変化する事はありません。
小数点の付いた数、つまり、7.89 のような実数を記述することも出来ます。これは、後で述べる浮動小数点数として扱われます。
定数の記述
定数の記述 整数の定数は、10 進数以外に、8 進数、16 進数で記述することもできます。
8進数 |
先頭に0(ゼロ)を付けます。
015 は 10進数で 13 を表します。
|
---|
16進数 |
先頭に0x(ゼロとエックス)を付けます。
0x1f は 10進数で 31 を表します。
|
---|
2.2. 変数を使う
変数を使う それでは、プログラムの中で変数をどのように使うのか、まずは、処理の内容を表す文章で見ていきましょう。
簡単な例文を示します。
- 変数 xがある。
- xの値を12とする。
これは、『 x という名前の変数があって、その値を 12 にした。』という事ですね。
それでは、もう少し複雑な例。
- 変数 x と、変数 y がある。
- x を 7 とする。
- y を x + 5 とする。
今度は変数が x と y の2つです。2 行目で x の値を 7 にしています。3 行目で y の値を x + 5、つまり、7 + 5 にしています。つまり、y は 12 になります。
このように、変数は、任意の値を保持させ、その値を参照することが出来るものなのです。
2.3. 変数宣言
変数宣言 最初の例を、もう一度見てみましょう。
- 変数 x がある。
- x の値を 12 とする。
1 行目では、x という名前の変数が存在する、という事を述べています。少し言い方を変えて『変数 x を使用する。』、『 x は変数である。』でもかまいません。
この 1 行目のような手続きを“変数宣言”と言います。プログラムの中で使用する変数を、使用する前に宣言しておくのです。値を格納する入れ物を用意して名前を付けておく、と考えても良いでしょう。
ここで、もし 1 行目の変数宣言がなく、2 行目だけの場合を考えてみてください。
x の値を 12 とする。
これでは x が何であるかが不明確です。変数であることは想像できますが確実ではありません。変数宣言によってプログラム中に出てきた x という名前が変数であるということを明確にしています。
C言語では変数を使用する場合に、必ず変数宣言を行わなければなりません。
ちなみに、他のプログラミング言語では、変数宣言が必要ないものもあります。『 x の値を 12 とする。』のような記述があると、自動的に変数 x が生成され、使用できるようになります。これは一見、楽なようですが、プログラムのミスを発見しにくくなるという弊害もあります。
データ型
データ型 それでは、変数が表す“値”とは何でしょうか。
C言語で扱う基本的な値は、整数か実数のどちらかです。そして、その中には、いくつかの種類があり目的によって使い分けます。
- 符号付きの整数。
- 符号なしの整数。
- 主に文字コードを保持するための整数。
- メモリのアドレスを保持するための整数。
- 普通の精度の実数。
- 精度の高い実数。
- これらを組み合わせたもの。
このような値の種類を“データ型”、あるいは、単に“型”と言います。
変数宣言とデータ型
変数宣言とデータ型 C言語の変数宣言では、変数にデータ型を指定します。変数は変数宣言で指定されたデータ型の値しか扱えません。
データ型の指定を含めると、最初の例文は次のようになります。
- 整数の変数x がある。
- xの値を12とする。
1 行目の変数宣言で、変数xが整数であるということを指定しています。つまり、整数を入れるための入れ物を用意したことになります。
x は整数ですから、もし 2 行目が次のようであるならば、間違ったプログラムということになってしまいます。
- 整数の変数 x がある。
- x の値を 2.34 とする。
変数 x は整数なので 2.34 という実数を扱うことは出来ません。
C言語の変数宣言
C言語の変数宣言 それでは、変数宣言が実際にどのようなコードであるかを見てみましょう。
整数型の変数 x を宣言するには、次のように記述します。
int x;
- 変数宣言はデータ型を表す語から始まります。ここでは“int(整数)”型です。
- データ型に続けて変数名を記述します。ここでは“x”です。
- 最後に文の最後を示す‘;’セミコロンを記述します 。
つまり、
データ型 変数名;
と、なります。
変数名は変数名のルールに従っていれば何でもかまいません。
データ型には、使用できるデータ型の何れかを指定します。
複数の変数を必要とする場合には、複数の変数宣言を記述します。
int x;
int y;
double d;
同じデータ型で複数の変数を宣言する場合には、変数名をカンマ‘,’で区切って記述することも出来ます。
int x, y, z;
変数名のルール変数名のルール- 英字と数字が使用できます。
- 最初の文字は英字でなければなりません。
- '_'(アンダースコア)は英字として扱われます。
変数宣言の場所
変数宣言の場所 変数宣言は波カッコ { } の先頭で、他の文の前に記述しなければなりません。
波カッコ { } は、関数の文を記述する箇所として使用されていますが、その内側でも、複数の文をまとめるブロックとして使用されます。
{
int x;
x = 12;
}
次のような変数宣言はエラーになります。
{
int x;
x = 12;
int y;
y = 15;
}
※ | ただし、C99 規格では、この制限がなく、どこにでも記述することが出来ます。 |
2.4. データ型
データ型 データ型には、C言語で定義されている基本的なデータ型、それに加え、自分で定義したデータ型があります。
これらは、どれも同じようにデータ型ですので、変数として使用することができます。
基本的なデータ型には修飾子というものがあり、どのようなデータであるかを細かく指定します。修飾子を含めてデータ型であると考えてかまいません。
以下が基本的なデータ型であり、これらはC言語の予約語※となっています。
※ | 予約語 : 変数名など、別の用途には使用できない単語 |
基本的なデータ型
int | 整数 |
char | 文字としての整数(1Byte) |
float | 浮動小数点数(実数を表す) |
double | 倍精度浮動小数点数 |
void | ない、型を特定しない |
修飾子
signed | 符号付き(負の値を表せる) |
unsigned | 符号なし(負の値を表せない) |
short | 小さい、と思ってください |
long | 大きい、と思ってください |
データ型の例
int | 符号付き整数 |
unsigned int | 符号なし整数 |
unsigned long int | 符号なしの大きな整数 |
signed short | 符号付きの小さな整数 |
修飾子の後の int は省略可能です。実際には、省略して書く方が一般的です。また、int は符号付きですので、あえて signed を書く必要もありません。
通常使用する基本的なデータ型の書き方をまとめると、以下のようになります。
整数 | 符号付き | 符号なし |
---|
char | unsigned char |
short | unsigned short |
int | unsigned int または unsigned |
long | unsigned long |
実数 | float |
---|
double |
long double |
データの大きさ
データの大きさ 変数が、どのくらい大きな、あるいは、小さな数値を扱えるのかは、重要な問題です。扱える数値の範囲は無限ではありません。変数が 0 から 1000 までしか扱えないのだとしたら、1001 という数値を保持できません。
扱える数値の範囲はデータ型によって異なるのですが、C言語として定められているわけではありません。あるデータ型が扱える数値の範囲は、処理系(コンパイラー)によって決められます。処理系 A と処理系 B では、同じ int 型であっても、扱える数値の範囲が異なるのです。
整数の場合、扱える数値の範囲は、そのデータ型が使用するビット数に依存します。例えば、16 ビットでは、-32,768 から 32,767 までの値を扱うことが出来ます。
以下に、例を示します。
処理系A
型 | ビット | 符号付きの場合 | 符号なし(unsigned)の場合 |
---|
char | 8bit | -128 ~ 127 | 0 ~ 255 |
---|
short | 16bit | -32,768 ~ 32,767 | 0 ~ 65,535 |
---|
int | 16bit | -32,768 ~ 32,767 | 0 ~ 65,535 |
---|
long | 32bit | -2,147,483,648~2,147,483,647 | 0 ~ 4,294,967,295 |
---|
処理系B
型 | ビット | 符号付きの場合 | 符号なし(unsigned)の場合 |
---|
char | 8bit | -128 ~ 127 | 0 ~ 255 |
---|
short | 16bit | -32,768 ~ 32,767 | 0 ~ 65,535 |
---|
int | 32bit | -2,147,483,648~2,147,483,647 | 0 ~ 4,294,967,295 |
---|
long | 32bit | -2,147,483,648~2,147,483,647 | 0 ~ 4,294,967,295 |
---|
ここで、処理系 A では、short(short int) と int が同じ、処理系 B では int と long(long int) が同じ大きさです。このように、short、longは int と同じ場合があります。
short、int、long の大きさには、以下の関係があります。
short ≦ int ≦ long
このように、処理系によって数値の範囲が異なるのは、C言語の特徴的な仕様の一つです。
2.5. 代入、その他
代入、その他値の代入
値の代入 変数には何らかの方法で値を設定しなければ意味がありません。値を設定するには‘=’記号を使用します。
例を示します。
int x;
x = 12;
ここで2行目の‘=’によって変数 x に値 12 が代入されます。数学での = は、“左辺と右辺が等しい”という意味ですが、C言語では、“右辺の値を左辺に代入する”という機能をします。したがって左辺は変数でなければなりません。右辺は定数(例のような数値の記述)でも変数でも計算結果でもかまいません。左辺の変数の型に該当する値が得られることが条件です。
右辺が変数の例を示します。
int x;
int y;
x = 12;
y = x;
①で x に 12 を代入し、②で x の値を y に代入しています。x と y の値は、共に 12 になります。
変数の初期化
変数の初期化 “変数宣言をする”に続けて“値を代入する”ということは頻繁に行われます。C言語には、変数宣言と同時に値を設定する書式があります。
int x = 100;
変数宣言で、変数名に続けて‘=’、続けて初期化する値を記述します。
変数の有効範囲
変数の有効範囲 宣言した変数は、波カッコ { } の内部でのみ有効です。
以下の例では、変数 x を有効範囲の外で使用しているため、エラーになります。
{
{
int x;
x = 12;
}
printf( "x=%d\n", x );
}
型変換、キャスト
型変換、キャスト 変数は、定義された型のデータしか扱えませんが、以下のようなコードは、書くことが出来ます。
short small;
long large = 123;
small = large;
ここでは、long 型の変数の値を、short 型の変数に代入しています。代入が実行されると、long 型からshort 型への型変換が行われます。
代入する値が、short の範囲で収まる大きさであれば問題ないのですが、値が大きい場合には元の情報が失われ、プログラマーが期待しない実行結果となってしまいます。
このような型変換が不用意に行われないために、処理系によってはコンパイル時に warning(警告)を出力します。
プログラマーは、問題の発生しそうな型変換を行わなければ良いわけですが、場合によっては、変換しても安全であることが分かっているので、意識して行うこともあります。
このような目的のために、明示的な型変換を行うことが出来ます。この明示的な型変換を“キャスト”と言います。
キャストは、変換したいデータの前に小カッコ ( ) で囲んだデータ型を記述します。
small = (short)large;
これで、warning は出力されなくなります。もちろん、変換しても問題ないことを、プログラマーが保障しなければなりません。変数 large が、short で扱える範囲を出ていれば、正しい結果が得られない事は同じです。
2.6. 出力と入力
出力と入力 プログラムにとって、出力と入力は、たいへん大きな問題です。プログラムが何も出力しないのだとしたら、そのプログラムが、どんなに複雑で難しく有用な計算を行ったのだとしても、我々には何ももたらしません。
少なくとも何かを出力する事は必要であり、多くの場合は、プログラムへの指示の為に入力も必要とします。
そして、出力も入力も、プログラムにとっては、面倒な問題を抱えているのです。
C言語のプログラムは、様々な環境で使用されています。コンソール・アプリケーションとして使用される場合もありますし、Window システムのアプリケーションで使用される場合もあります。もしかすると、携帯電話のアプリケーションにC言語が使われているかもしれません。
このような動作環境の違いによって、出力の方法も入力の方法も、全く違ってくるのです。
コンソール・アプリケーションと Window システムのアプリケーションでは、文字列の表示方法が異なります。タイプライター型のキーボードと、携帯電話では、同じように入力できないでしょう。
したがって、作成するプログラムの目的が明確ではない学習の段階で、出力、入力の処理に時間をかけるのは懸命ではありません。
よって、ここではプログラムの学習に必要な、標準ライブラリの関数による、標準入出力についてだけ解説します。
出力の方法
出力の方法 標準出力、つまり、コンソール画面に文字を表示します。
printf 関数
printf 関数 既に使用したとおり、printf 関数は文字列を出力する機能を持っています。さらに printf には、書式付き出力と言う、値を文字列に変換して出力する機能があります。
例えば、int 型の変数 x の値を表示するには次のように記述します。
printf( "x=%d\n", x );
“%d”の部分が x の値を 10 進数とした文字列に置き換わって出力されます。他の部分、“x=”と“\n”は、そのまま出力されます。
また、定数や式の値を表示することも出来ます。
printf( "今日は%d日です\n", 15 );
printf( "3 + 5 = %d\n", 3 + 5 );
2つの値、x、y を表示するには、次のように記述します。
printf( "x=%d, y=%d", x, y );
最初の %d に xの値が、次の %d に y の値が置き換わります。
printf 関数の引数の数は可変であり、置き換える値が3つ以上の場合も同様です。
%d は int 型の値を 10 進数で表示するものですが、% に続く文字によって機能が変わります。以下に、いくつかのパターンを示します。
パターン | データ型 | 機能 |
---|
%d、%i | int | 10進数で表示する。 |
%2d、%2i | int | 10進数 2桁で表示する。%の後の数字は桁数。 |
%x、%X | int | 16進数で表示する。xはabcdef、XはABCDEFが使用される。 |
%u | int | 符号なし10進数で表示する。 |
%c | int | 文字として表示する。 |
%s | char* | 文字列を表示する。(char*は文字列へのポインタ:後述) |
%f | double | 実数を表示する。 |
%p | void* | ポインタ(アドレス)を表示する。 |
%% | | % を表示する。 |
puts 関数
puts 関数 文字列を出力します。printf のような書式付き出力の機能はありません。
また、文字列の最後には“\n”が付加されるので、改行が行われます。
入力の方法
入力の方法 標準入力、つまり、キーボードから入力します。
scanf 関数
scanf 関数 キーボードからの入力を整数や文字列などに変換して取得します。
1番目の引数である書式文字列により、得られるデータの内容が変わります。
以下に整数、文字列を得る書式を示します。
整数
scanf( "%d", &x );
xはint型の変数です。
文字列※
scanf( "%s", s );
sは文字配列です。
scanf では、最後に Enter キーを押すと入力が完了します。
出力、入力の例
出力、入力の例 2つの値を入力して出力するプログラム例です。
int n1, n2;
scanf( "%d", &n1 );
scanf( "%d", &n2 );
printf( "n1=%d, n2=%d\n", n1, n2 );