Tips

C言語 変数 【基礎 第4回】

C言語の基本構造

変数とは

先ほどのプログラムで画面に文字を表示させることができました。
複雑なプログラムになれば、単純に値を表示させるのではなく、計算結果を別の処理のところで再利用しなければ
ならないケースが多々あります。その時、利用するたびに最初から計算するのではなく、計算して得られた値を
どこかに保持しておいた方が便利です。
そうしたプログラム内で使用する値を格納しておくために使用されるものが変数(variable)と呼ばれるものです。
「変」という文字が使われていることからも、その中に格納する値は変更することができます。
プログラム上で変数を宣言するとメモリ上に必要な領域が確保されます。
プログラム内で複数の値を保持したいとなった場合、複数の変数を作成することになります。
複数の変数を作成するとそれぞれの領域を区別する必要があり、そのためにつけられる名前が変数名となります。
こういった変数や関数などを識別するためのものを識別子といいます。

変数名は特に決められた名前があるわけではありませんが、使用してはいけない文字などがあり、識別子のルールは
以下のようになっています。
・最初の文字はアルファベットの大文字、小文字、_(アンダーバー)で始めること
・2文字目以降は数値を使用しても構わない
・大文字と小文字は区別される
・予約語はつかってはいけない

予約語には以下のものがあり、これらの単語を変数名や関数名に使用してはいけません。
char short int long float double signed unsined 
auto static void const extern
volatile register return goto if else switch case default break 
for while do continue typedef struct enum union sizeof inline 

変数の型と修飾子

変数を使用したい場合はC言語では必ず変数を宣言する必要があります。
変数を宣言することでメモリ上に必要な領域が確保されるのですが、C言語ではどのくらいのサイズで
どういったデータ(整数、小数など)を扱うためのメモリ領域を確保するのかを指定しなければなりません。
そこで確保するメモリのサイズを指定するための型というものが存在し、以下のようになっています。

種類 サイズ 範囲
unsigned char 文字型 8ビット -128~127
char 符号なし文字型 8ビット 0~255
short int 整数型 16ビット -32768~32767
unsigned short int 符号なし整数型 16ビット 0~65535
int 整数型 32ビット -2147483648~2147483647
unsigned int 符号なし整数型 32ビット 0~4294967295
long int 整数型 32ビット -2147483648~2147483647
unsigned long int 符号なし整数型 32ビット 0~4294967295
float 実数型 32ビット 約10^-38~10^38
double 倍精度実数型 64ビット 約10^-308~10^308

先ほどのページに挙げたように型にはいくつか種類があり、
保持したいデータのサイズにあった型を選択する必要があります。例えば「1000000」という数値を保持するために
「short int」型を使用することはできません。
また「int」型は処理系によって大きさが変わります。(もっとも効率よく処理できる整数の幅がintのサイズとなります)

◆サイズ修飾子

先ほどのページで「short」や「long」といったものが出てきましたが、この2つはサイズ修飾子といわれます。
変数のサイズを修飾するものとなります。「short」は「int」以下、「long」は「int」以上ということになっています。

※「short int」と「long int」は「int」を省略することができます。

◆符号修飾子

サイズ修飾子以外にも整数型には符号修飾子というものもあります。
負の数を扱うかどうかを表します。「unsigned」を使用すると正の数だけとなり、符号を表すために使用していた領域まで
数を表すことに使用できるようになります。そのため表せる正の数の上限が増えます。
何も表記しない場合、「signed」とみなされます。

■変数の宣言と初期化

◆変数の宣言

先ほど述べたようにC言語では変数は宣言してからでなければ使用できません。
また処理系によりますが、変数はブロックの先頭の方で宣言しなければコンパイルエラーとなる場合があります。
宣言するには以下のよう「型 変数名」にします。 このとき、宣言の末尾をセミコロン 「 ; 」 で区切ります。

int num;

この場合メモリ上に32ビットの領域を確保して「num」という名前でアクセスする形となります。
このnumには整数でint型の範囲であればデータを格納できます。
宣言した変数に値を格納するには「変数 = 値」とやります。
先ほどの例をとってint型の「num」を宣言しているとします。変数numに「100」という整数を格納する場合は
次のようになります。
宣言したデータ型以外の値を代入すると、コンパイルエラーになる場合があります。

num = 100;

コードで確認

実際に使用してみます。

#include <stdio.h>
int main(void){
	int num;
	num = 100;
	printf(“numの中身は%dです”, num );
	return 0;
}

printfのところを見ると「%d」というのがあります。また「””」の後ろにカンマで区切って変数numをつけています。
「printf」関数は第一引数に指定した文字列を表示させるものですが、その中で書式指定ができるようになっています。
「%」で始まるフォーマット指定子を使用することで第二引数以下の引数を文字列の中にはめ込むことが
できるようになっています。
今回使用した「%d」は10進数の整数を表すもので
ここでは変数num値が「%d」のところに組み込まれて画面に表示されるようになります。

結果は「numの中身は100です」と表示されると思います。
変数の中の値が10進数の整数として%dの部分に表示されます。

変数の初期化

先ほどのページでnumを宣言し、100という値を格納しましたが何も値を入れない場合、numの中身はどうなるでしょうか?
何も値を入れずに値を表示させるプログラムを見てみます。

#include <stdio.h>
int main(void){
	int num;
	printf("%d",num);
	return 0;
}

「%d」を使用しているので第二引数を10進数の整数として表示させます。

このコードをコンパイルするとコンパイル自体は問題なく成功します。しかし実行するとエラーとなります。
値の入っていない変数を表示させようとしているからです。
Visual Studioではエラーが出て以下のような文言が確認できます。
[The variable ‘num’ is being used without being initialized.]

C言語の場合、宣言しただけでは変数の中には、値が入っておらず
「不定」ということになります。エラーを無視して表示させたとしても妙な数値が表示されるだけとなります。
それを避けるために変数にはあらかじめ値を格納しておかなければならない場合があります。
この変数にあらかじめ値を格納しておくことを初期化といいます。初期値を格納するには先ほどのように宣言を行った後、
値を代入する方法と、宣言と同時に初期化してしまう方法があります。
「型 変数名 = 値;」という構文になります。

int num = 100; 

また変数の宣言や初期化は複数同時に行うことができます。
以下のようにすることができます。

int num = 100, num2 = 10;
int num, num2 = 10;
int num,num2;

しかし以下のようにすることはできません。型の違うものは1文で宣言できません。

int num,char a; 

コードで確認

変数は初期化する必要があるといいましたが、左辺として使用する場合は初期化の必要がありません。

#include <stdio.h>
int main(void){
	int num = 100;
	int sum;
	//num = sum; この行はエラーとなります。
	sum = num;
	return 0;
}		     

このプログラムの5行目のコメントを外すとエラーとなります。
変数「sum」には初期値が格納されていないからです。値の不定なものを変数「num」に格納するということになるので
実行時にエラーとなります。
しかし初期化されていない変数「sum」を左辺に持ってきているその下の部分の処理であれば、値が不定となっているところに
変数「num」の値である100を代入するということになるので問題ありません。
変数であるため値の上書きは問題ありません。

実践力が身につくC言語講座 連載リンク

競技プログラミングをイメージしたライブラリ活用講座
競技プログラミング風-標準Cライブラリ入門 連載

アルゴリズムをマスターして技術力アップ!
実践アルゴリズム講座 連載

パズルゲームの解析をテーマにしたC++講座
ゲーム解析プログラミング 連載

Recent News

Recent Tips

Tag Search