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