C言語 ~2日目~

変数について

プログラムは、コンピュータへの命令実行とデータの処理から成り立っています。
データとは、命令によって扱われる入力情報や命令の過程や結果として生じる出力情報を指します。
プログラム内では、このデータに名前を割り当てて一時的にコンピュータのメモリに保持させます。
この一時的な記憶場所を「変数」と呼びます。
変数には、数値や文字列などのデータを格納することが可能です。

変数の基本的な使い方

変数を使用するためには、以下の3つのステップを行います。

1.変数の宣言
変数を作成します。これを変数の「宣言」といいます。
C言語での構文は以下の通りです。

データ型 変数名;

たとえば、メモリ上に「num」という名前の整数を扱う作業エリアを用意する場合

int num;

と記述します。
C言語においては、変数に値を割り当てたり、計算のために変数の値を参照したりしながら、命令文を実行していきます。
プログラムで必要になる変数は、使用する前に宣言する必要があります。

2.値の代入
宣言した変数に値を入れることを「代入」といいます。
C言語での変数に値を代入する構文は以下の通りです。

変数名;

変数名には、宣言済みの変数の名前を記述します。
値には代入する値を記述します。
=(イコール)は代入演算子と言います。
たとえば、「num」という変数に10を代入する場合、以下のように記述します。

num = 10;

これで変数「num」に10という値が入ります。

3.値の参照
変数に入れた値を使うことを「参照」と言います。
プログラムの中で変数名を書くと変数の値が参照されます。
以下の例は、変数の値を他の変数に代入し、代入先の変数の値を参照しています。

int i;  // 変数の宣言
int j; // 変数の宣言
i= 10; // 値の代入
j = i;  // iの値が参照され、jに代入
printf("j=%d",j); // jの値の参照

実行結果
j=10

また、変数の値を使って、計算を行うこともできます。

int i;
int j;
i = 10; // 値の代入
j = i +5; //i+5の値をjに代入
printf("j=%d",j); // jの値の参照

実行結果
j=15;

4.変数の初期化
変数の宣言と値の代入を一度に行うこともできます。

int i = 10;

このように記述すると10が代入された状態の変数iを作成することができます。
変数の宣言時に初期値(はじめの値)を代入することを初期化と呼びます。
【注意】変数を宣言しただけでは、変数の値は不定値のため、必ず初期化をしてから変数を使用するようにしてください。

データ型

データ型とは、プログラムで扱う値の種類のことを言います。
データ型によって、メモリ上に確保される領域の大きさや値の範囲が決まります。
C言語で使用できる主なデータ型は以下の通りです。

データ型バイト数扱える値の範囲説明
char1byte-128から127文字や符号付き整数を表す
unsigned char 1byte0から255符号なし整数を表す
int4byte-2147483648から2147483647符号付き整数を表す
unsigned int4byte0から4294967295符号なし整数を表す
short2byte32768から32767符号付き整数を表す
long int8byte-9223372036854775808から9223372036854775807符号付き整数を表す
float4byte小数点以下の桁数が約7桁まで単精度浮動小数点の数を表す
double8byte小数点以下の桁数が約15桁まで倍精度浮動小数点の数を表す
※int型のサイズは処理系によって異なってきます。sizeof()関数を使用して正確なメモリサイズ(バイト数)を確認することができます。
int main()
{
	char a;
	unsigned char b;
	int c;
	unsigned int d;
	short e;
	long  f;
	float g;
	double h;
	
	printf("char:%d\n",sizeof(a));
	printf("unsigned char:%d\n",sizeof(b));
	printf("int:%d\n",sizeof(c));
	printf("unsigned int:%d\n",sizeof(d));
	printf("short:%d\n",sizeof(e));
	printf("long:%d\n",sizeof(f));
	printf("float:%d\n",sizeof(g));
	printf("double:%d\n",sizeof(h));
	return 0;
	
}

char:1
unsigned char:1
int:4
unsigned int:4
short:2
long:8
float:4
double:8

型名がlong intは、int型が2byte長なら4byte長、4byte長なら8byte長の整数値を格納できます。C言語の32ビット処理系の場合はint型もlong型も4byteの整数を表します。環境によってintやlong intの長さが異なることに注意が必要です。

主な型の宣言する例を示します。

①char型

char c =A; // ⽂字を代⼊
char d = 65; // ASCIIコードを代⼊
unsigned char e = 255; // 符号なし整数を代⼊

②int型

int x = 100; // 整数を代⼊
unsigned int y = 200; // 符号なし整数を代⼊
short int z = 300; // 短整数を代⼊
long int w = 400; // ⻑整数を代⼊

③float型

float f = 3.14; // ⼩数を代⼊
float g = 1.23e4; // 指数表記で代⼊

④double型

double h = 2.718; // ⼩数を代⼊
double i = 6.02e23; // 指数表記で代⼊

変数名について

変数名を付けるには以下のような規則があります。
・アルファベットの⼤⽂字(AからZ)、 ⼩⽂字(aからz)
・数字(0から9)
・記号 _(アンダースコア)
※最初の⽂字は数字以外の⽂字でなければいけません
※アルファベットの⼤⽂字と⼩⽂字は区別されます

※C99(1999年にISOで定められた規格)以降はUnicode文字にも対応しているので、日本語の変数名を使用することも可能です。

また、「予約語」と言われるプログラムで利用できない識別名があります。
予約語は、あらかじめ決まったスペルであり、決まった意味を持つため、変数名や関数名などに使用することはできません。
C言語での予約語は次のようなものがあります。

autobreakcase charconstcontinue
defaultdodoubleelseenumextern
floatforgotoifinlineint
longregisterrestrictreturnshortsigned
sizeofstaticstructswitchtypedeftypeof
unionunsignedvoidvolatilewhile

型キャストについて

変数のデータ型を違うデータ型に変換することを「型キャスト」といいます。
型キャストには、「暗黙的な型キャスト」と「明示的な型キャスト」があります。

・暗黙的な型キャスト
代入や演算式の中で、コンパイラが自動的に型変換を行うことをいいます。
①異なる型へ代入するとき
代入を行う際、代入演算子「=」の左側の型と右側の型が異なる場合は、左側の型へと変換されます。

int main(void)
{
    int a;
    double b = 3.14;
    a = b; // 左辺の型(int)に変換される
    printf("a=%d",a);
    return 0;
}

実行結果
a=3

この例では、int型の変数aにdouble型の変数bの値を代入し、暗黙的な型キャストを行っています。
そのため、aにはbの整数部しか格納されません。精度が高いデータ型の値を精度が低いデータ型の変数にキャストして代入する際は、精度が低下する可能性があるため注意が必要です

②演算式を挟んでデータ型が異なるとき
演算を行う際、異なるデータ型の変数が組み合わされると、より高精度のデータ型に変換されます。

int main()
{
    short int i = 5;
    long int l = 10;
    double d = 3.14;
    double result;

    result = i * l + d;
    printf("result=%lf\n",result);
}

実行結果
result=53.140000

この例では、まず、short int型の変数i とlong int型の変数 lの乗算を実行することにより、long int型に暗黙的な型キャストが行われます。
次に、long int型の値とdouble型の変数dの加算時、double型に暗黙的な型キャストが行われます。
その後、そのまま左辺のdouble型の変数resultに代入されています。

・明示的な型キャスト
プログラムを記述しているときに、強制的に別の型に変換したいときに用います。

以下は、同じ型同士の演算であっても、予期しない結果になったため、明示的に型キャストを行ったサンプルプログラムです。

int main()
{
     int a=3;
     int b=2;
     double f1;
     double f2;
 
     f1=a/b;
     printf("f1=%lf\n",f1);
 
     f2 = (double)a/b;
     printf("f2=%lf\n",f2);
}

f1 = a/b;

上記の式は、小数点以下の結果を期待していても整数型同士の演算は整数の結果を返すため、3÷2の計算結果は1になり、その値がf1に代入されf1の値は1.0となります。
期待される値がdouble型の場合、以下の式のように明示的に型変換を行います。

f2 = (double)a / b;

aをdouble型にキャストしてから演算を行うと、3.0÷2の結果として1.5が得られ、その値がf2に代入されf2の値は1.5となります。

実行結果
f1=1.000000
f2=1.500000

例題

変数を宣言しprintfで表示するサンプルをいくつか記載します。

int main(void){
	char c = 'A';
	printf("%c\n",c); // 文字の出力
	printf("%d\n",c); // 整数値の出力
	printf("%04x\n",c); // 16進数の出力
	printf("%04o\n",c); // 8進数の出力
}
実行結果
A
65
0041
0101

int main(void){
    float a = 100.1;
    float b = 23.3;
    printf("%.1f+%.1f=%.1f\n",a,b,a+b);
}
実行結果
100.1+23.3=123.4

コメント

この記事へのコメントはありません。

関連記事

ポインタの極意 後編

C言語のメリット

C言語 ~3日目~

PAGE TOP