目次

 

 

 

 

 

 

Top >C言語入門 とりあえずのC言語

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. 変数を使う

変数を使う

 それでは、プログラムの中で変数をどのように使うのか、まずは、処理の内容を表す文章で見ていきましょう。

 簡単な例文を示します。

  1. 変数 xがある。
  2. xの値を12とする。

 これは、『 x という名前の変数があって、その値を 12 にした。』という事ですね。

 それでは、もう少し複雑な例。

  1. 変数 x と、変数 y がある。
  2. x を 7 とする。
  3. y を x + 5 とする。

 今度は変数が x と y の2つです。2 行目で x の値を 7 にしています。3 行目で y の値を x + 5、つまり、7 + 5 にしています。つまり、y は 12 になります。

 

 このように、変数は、任意の値を保持させ、その値を参照することが出来るものなのです。

2.3. 変数宣言

変数宣言

 最初の例を、もう一度見てみましょう。

  1. 変数 x がある。
  2. x の値を 12 とする。

 1 行目では、x という名前の変数が存在する、という事を述べています。少し言い方を変えて『変数 x を使用する。』、『 x は変数である。』でもかまいません。

 

 この 1 行目のような手続きを“変数宣言”と言います。プログラムの中で使用する変数を、使用する前に宣言しておくのです。値を格納する入れ物を用意して名前を付けておく、と考えても良いでしょう。

 

 ここで、もし 1 行目の変数宣言がなく、2 行目だけの場合を考えてみてください。

x の値を 12 とする。

 これでは x が何であるかが不明確です。変数であることは想像できますが確実ではありません。変数宣言によってプログラム中に出てきた x という名前が変数であるということを明確にしています。

 C言語では変数を使用する場合に、必ず変数宣言を行わなければなりません。

 

 ちなみに、他のプログラミング言語では、変数宣言が必要ないものもあります。『 x の値を 12 とする。』のような記述があると、自動的に変数 x が生成され、使用できるようになります。これは一見、楽なようですが、プログラムのミスを発見しにくくなるという弊害もあります。

データ型

データ型

 それでは、変数が表す“値”とは何でしょうか。

 C言語で扱う基本的な値は、整数か実数のどちらかです。そして、その中には、いくつかの種類があり目的によって使い分けます。

  • 符号付きの整数。
  • 符号なしの整数。
  • 主に文字コードを保持するための整数。
  • メモリのアドレスを保持するための整数。
  • 普通の精度の実数。
  • 精度の高い実数。
  • これらを組み合わせたもの。

 このような値の種類を“データ型”、あるいは、単に“型”と言います。

変数宣言とデータ型

変数宣言とデータ型

 C言語の変数宣言では、変数にデータ型を指定します。変数は変数宣言で指定されたデータ型の値しか扱えません。

 データ型の指定を含めると、最初の例文は次のようになります。

  1. 整数の変数x がある。
  2. xの値を12とする。

 1 行目の変数宣言で、変数xが整数であるということを指定しています。つまり、整数を入れるための入れ物を用意したことになります。

 

 x は整数ですから、もし 2 行目が次のようであるならば、間違ったプログラムということになってしまいます。

  1. 整数の変数 x がある。
  2. 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 を書く必要もありません。

 

 通常使用する基本的なデータ型の書き方をまとめると、以下のようになります。

整数符号付き符号なし
charunsigned char
shortunsigned short
intunsigned int または unsigned
longunsigned long
実数float
double
long double

データの大きさ

データの大きさ

 変数が、どのくらい大きな、あるいは、小さな数値を扱えるのかは、重要な問題です。扱える数値の範囲は無限ではありません。変数が 0 から 1000 までしか扱えないのだとしたら、1001 という数値を保持できません。

 

 扱える数値の範囲はデータ型によって異なるのですが、C言語として定められているわけではありません。あるデータ型が扱える数値の範囲は、処理系(コンパイラー)によって決められます。処理系 A と処理系 B では、同じ int 型であっても、扱える数値の範囲が異なるのです。

 

 整数の場合、扱える数値の範囲は、そのデータ型が使用するビット数に依存します。例えば、16 ビットでは、-32,768 から 32,767 までの値を扱うことが出来ます。

 以下に、例を示します。

処理系A
型ビット符号付きの場合符号なし(unsigned)の場合
char8bit-128 ~ 1270 ~ 255
short16bit-32,768 ~ 32,7670 ~ 65,535
int16bit-32,768 ~ 32,7670 ~ 65,535
long32bit-2,147,483,648~2,147,483,6470 ~ 4,294,967,295
処理系B
型ビット符号付きの場合符号なし(unsigned)の場合
char8bit-128 ~ 1270 ~ 255
short16bit-32,768 ~ 32,7670 ~ 65,535
int32bit-2,147,483,648~2,147,483,6470 ~ 4,294,967,295
long32bit-2,147,483,648~2,147,483,6470 ~ 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、%iint10進数で表示する。
%2d、%2iint10進数 2桁で表示する。%の後の数字は桁数。
%x、%Xint16進数で表示する。xはabcdef、XはABCDEFが使用される。
%uint符号なし10進数で表示する。
%cint文字として表示する。
%schar*文字列を表示する。(char*は文字列へのポインタ:後述)
%fdouble実数を表示する。
%pvoid*ポインタ(アドレス)を表示する。
%%% を表示する。
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 );
PAPER BOWL
NEZEN