1. C言語のデータ
C言語で扱われるデータは大きく「定数」と「変数」に分けられます。
- 定数: 値を変えないもの
- 変数: 任意の値をとりうるもの
ということができます。
たとえば、a = 10; a = 20; では、a は「変数」、10 や 20 は「定数」になります。
「a = 10;」 は、a に 10 を代入するという意味になります。詳しくは「3-1. 代入演算子(=)」を参照してください。
2. 定数
代表的な定数は下記のように分類できます。
数値定数 | 整数定数 | 8進数 | 先頭に「0」をつけて表記(077など) |
---|---|---|---|
10進数 | 通常の10進数と同じ表記 | ||
16進数 | 先頭に「0x」をつけて表記(0x41など) | ||
浮動小数点定数 | 小数点以下が扱える数(16.25 や 1.0e-3 など) | ||
文字定数 | 1文字のこと。’A’ や ‘B’ のように ‘ ‘ で囲んで表記 | ||
文字列定数 | 複数文字のこと。”ABC” や “computer”のように ” “で囲んで表記 |
3. 変数
(1) 変数の型
変数とはコンピュータのメモリ上に実際に用意された作業エリアです。
int data;
と記述すると、メモリ上に「data」という名前の整数を扱う 2バイトの作業エリアが用意されますし、
float data2;
記述すると、メモリ上に「data2」という名前の浮動小数点数を扱う 4バイトの作業エリアが用意されます。
C言語ではこの変数に、定数を代入したり、演算を行ったりしながら処理を進めていきます。 変数が、どのようにメモリ上で扱われるかは、こちらを参照してください。
プログラムを作成するとき、必要になる変数はすべてどういう作業エリアにするか使用する前に宣言しなければなりません。
以下に変数の主な型をまとめます。データ型の修飾については、第14章を参照してください。
型指定 | データ型 | バイト幅 | 扱える数値の範囲 |
---|---|---|---|
char | 文字型 | 1 | -128~127 |
short | 短整数型 | 2 | -32768~32767 |
int | 整数型 | 4 | -2147483648~2147483647 |
long | 倍長整数型 | 4 | -2147483648~2147483647 |
float | 単精度浮動小数点型 | 4 | 3.4E-38~3.4E+38 |
double | 倍精度浮動小数点型 | 8 | 1.7E-308~1.7E+308 |
(2) 変数の名付けルール
変数名を付けるには以下のようなルールがあります。 これは、関数や記号定数でも同様となります。
- 先頭の文字は英字(a~z、A~Z)または下線(_)でなければならない。
- 2文字目以降は英字、下線、数字である。
- 大文字と小文字を区別する。
- 先頭から最低31文字までが有効である。
- 予約語(C言語の文法上で使われる語)と同じ綴り(do、for など)は使用できないが、識別名の一部に入るのは可(dot、form など)。
- ルールではありませんが、変数名はその変数を端的に表す名前を付けましょう。平均値を格納する変数名を単に「a」とするのと、「average」とするのとでは、プログラムの読みやすさが全然違います。
- 下線(_)で始まる変数名は、C言語の処理系が予約識別子(処理系で使用する識別子)として用いている可能性があります。下線で始まる変数名はつけないようにしましょう。
(3) 変数の初期化
宣言時に値を代入することを初期化と呼びます。変数は宣言時に必要な値で初期化するか、宣言後に必要な値を代入しなければなりません。
宣言しただけでは、不定値(ゴミ)が入っているので、仮に初期値を 0 にしたい場合でも、きちんと
int a = 0;
のように初期化してください。
データの扱い方 サンプルプログラム
#include <stdio.h>
int main(void)
{
char moji = 'H'; // mojiを文字型で宣言し、'H'で初期化
int cnt = 5; // cntを整数型で宣言し、5で初期化
float x, y; // xとyを単精度浮動小数点型で宣言
double z; // zを倍精度浮動小数点型で宣言
x = 2.6f; // xに2.6を代入(float型なので、接尾語fを追加)
y = 3.8f; // yに3.8を代入(float型なので、接尾語fを追加)
z = x + y; // x + yをzに代入
long goukei; // goukeiを倍長整数型で宣言
goukei = 100 * cnt; // 100 * cnt を goukeiに代入
printf("moji = %c\n", moji); // moji を出力
printf("z = %f\n", z); // z を出力
printf("goukei = %ld\n", goukei); // goukeiを出力
return 0;
}
【実行結果例】
moji = H
z = 6.400000
goukei = 500
〇 演習問題
問1
コメントを参考に次のプログラムの空欄部を埋めて、プログラムを完成しなさい
#include <stdio.h>
int main(void)
{
int a, b;
double c, d;
char e, f;
char str[] = ______; // 文字列定数 COMPUTER の設定
a = ______; // 10進定数 5 の設定
b = ______; // 16進定数 2fb の設定
c = ______; // 浮動小数点定数 3.14 の設定
d = ______; // 浮動小数点定数 2.548×10²(指数形式)の設定
e = ______; // 文字定数 A の設定
f = ______; // 文字定数 8 の設定
printf("str = %s\n", str);
printf("a = %d\n", a);
printf("b = %x\n", b);
printf("c = %f\n", c);
printf("d = %e\n", d);
printf("e = %c\n", e);
printf("f = %c\n", f);
return 0;
}
【実行結果例】
str = COMPUTER
a = 5
b = 2fb
c = 3.140000
d = 2.548000e+02
e = A
f = 8
問2
コメントを参考に次のプログラムの空欄部を埋めて、プログラムを完成しなさい。
#include <stdio.h>
int main( void )
{
______; // 変数 a と b を単精度浮動小数点型で宣言
______; // 変数 c を倍精度浮動小数点型で宣言
______; // 変数 seki を倍長整数型で宣言
______; // 変数 i を単長整数型で宣言し、180で初期化
______; // 変数 j を単長整数型で宣言し、500で初期化
______; // 変数 ch を文字型で宣言し、文字定数 'S' で初期化
a = 62.5;
b = 23.3;
c = a * b;
seki = ( long )i * j;
printf( "ch = %c\n ", ch ); // ch を出力
printf( "c = %f\n", c ); // c を出力
printf( "seki = %ld\n", seki ); // seki を出力
return 0;
}
【実行結果例】
ch = S
c = 1456.249952
seki = 90000
解答例
【問1】
#include <stdio.h>
int main(void)
{
int a, b;
double c, d;
char e, f;
char str[] = "COMPUTER"; // 文字列定数 COMPUTER の設定
a = 5; // 10進定数 5 の設定
b = 0x2fb; // 16進定数 2fb の設定
c = 3.14; // 浮動小数点定数 3.14 の設定
d = 2.548e2; // 浮動小数点定数 2.548×10²(指数形式)の設定
e = 'A'; // 文字定数 A の設定
f = '8'; // 文字定数 8 の設定
printf("str = %s\n", str);
printf("a = %d\n", a);
printf("b = %x\n", b);
printf("c = %f\n", c);
printf("d = %e\n", d);
printf("e = %c\n", e);
printf("f = %c\n", f);
return 0;
}
【問2】
#include <stdio.h>
int main(void)
{
float a, b; // 変数 a と b を単精度浮動小数点型で宣言
double c; // 変数 c を倍精度浮動小数点型で宣言
long seki; // 変数 seki を倍長整数型で宣言
long i = 180; // 変数 i を単長整数型で宣言し、180で初期化
long j = 500; // 変数 j を単長整数型で宣言し、500で初期化
char ch = 'S'; // 変数 ch を文字型で宣言し、文字定数 'S' で初期化
a = 62.5;
b = 23.3;
c = a * b;
seki = (long)i * j;
printf("ch = %c\n ", ch); // ch を出力
printf("c = %f\n", c); // c を出力
printf("seki = %ld\n", seki); // seki を出力
return 0;
}
● 補足:予約語
C言語では、次のものを予約語としています。予約語は識別子(変数名や関数名など)には使えません。
【予約語一覧】
auto break case char const continue default do double else enum extern float for goto if inline int long register restrict return short signed sizeof static struct switch typedef union unsigned void volatile while
_Alignas(※) _Alignof(※) _Atomic(※) _Bool _Complex
_Generic(※) _Imaginary _Noreturn(※) _Static_assert(※) _Thread_local(※)
※印が付いているものは、C11(2011年に策定されたC言語の規格)で追加された予約語です。C11では、従来のC言語にいくつかの機能が追加されており、これらの予約語もその一部です。
コメント