「プログラム上のすべてのデータには、必ず何らかのデータ型がある。」
ここまで整数型を学んだ。この章では残りのデータ型をまとめ、「定数(リテラル)」という概念を学ぶ。
| 型名 | 意味 | サイズ(目安) | 使用例 |
|---|---|---|---|
int | 整数 | 4 バイト | 10, -5, 0 |
double | 実数(倍精度) | 8 バイト | 3.14, -2.7 |
float | 実数(単精度) | 4 バイト | 3.14f, -0.5f |
char | 文字(1文字) | 1 バイト | 'A', '7' |
文字列(char[]) | 文字の並び | 文字数+1 バイト | "Hello", "abc" |
double を優先する(float より精度が高い)char の配列として扱われる(後の章で詳しく学ぶ)定数とは、プログラム中に直接書かれた値のことで、リテラルとも呼ぶ。
変数は後から値を変えられるが、定数はプログラム中で固定された値である。
int x = 10; /* 10 が定数(整数リテラル)、x が変数 */
以下はすべて定数の例:
| 定数 | 型 | 説明 |
|---|---|---|
100 | int | 整数リテラル |
3.14 | double | 実数リテラル(何もつけなければ double) |
3.14f | float | 末尾に f をつけると float 型 |
'A' | char | 文字リテラル(シングルクォート) |
"Hello" | char[] | 文字列リテラル(ダブルクォート) |
0xFF | int | 16進数リテラル(0x を前置) |
0755 | int | 8進数リテラル(0 を前置) |
0 をつけると 8進数として解釈される。010 は 10 進数の 10 ではなく、8進数の 10(= 10進数の 8)になる。意図しない値になりやすいので注意。
| 表記形式 | 意味 | 例と10進数での値 |
|---|---|---|
10 | 10進数(通常) | int x = 10; → 10 |
0xFF | 16進数 | int x = 0xFF; → 255 |
0755 | 8進数 | int x = 0755; → 493 |
3.14 | 実数(double) | double d = 3.14; |
3.14f | 実数(float) | float f = 3.14f; |
C言語では 7(数値)と '7'(文字)はまったく別のものである。
| 表現 | 内容 | 型 | 実際の値 |
|---|---|---|---|
7 | 数値の 7 | int | 7 |
'7' | 文字の「7」 | char | 55(ASCIIコード) |
'A' | 文字の「A」 | char | 65(ASCIIコード) |
char 型は内部的には整数(ASCIIコード)として保存されている。
そのため 'A' + 1 は 65 + 1 = 66 → 文字 'B' になる。
'A'(シングルクォート)は1文字。"A"(ダブルクォート)は文字列。この違いは重要。
| 文字 | 10進 | 16進 | 文字 | 10進 | 16進 |
|---|---|---|---|---|---|
'A' | 65 | 0x41 | 'a' | 97 | 0x61 |
'B' | 66 | 0x42 | 'b' | 98 | 0x62 |
'0' | 48 | 0x30 | '1' | 49 | 0x31 |
'!' | 33 | 0x21 | '?' | 63 | 0x3F |
全体の表は Wikipedia(ASCIIコード一覧) で確認できる。
%d ← int(整数)を表示%f ← double / float(実数)を表示。%.2f は小数点以下2桁%c ← char(1文字)を表示
#include <stdio.h>
int main(void)
{
int score = 90;
double rate = 0.85;
char grade = 'A';
printf("スコアは %d 点です\n", score);
printf("成功率は %.2f です\n", rate);
printf("評価は %c です\n", grade);
return 0;
}
実行結果:
スコアは 90 点です 成功率は 0.85 です 評価は A です
Q1. 次のコードで 5 の種類として正しいものはどれか。
int a = 5;
ア. 文字型定数
イ. 整数型定数
ウ. 実数型定数
エ. 整数型変数
正解:イ
5 はプログラム中に直接書かれた整数リテラル(定数)。a が変数、5 が定数。
Q2. 次のコードで '!' の型はどれか。
char mark = '!';
ア. 文字型定数
イ. 整数型変数
ウ. 実数型定数
エ. 文字列定数
正解:ア
シングルクォートで囲まれた1文字は char 型の定数。ダブルクォートの "!" は文字列定数になる。
Q3. 次のコードで rate の種類はどれか。
float rate = 0.05f;
ア. float 型定数
イ. float 型変数
ウ. double 型変数
エ. 文字型定数
正解:イ
rate は float 型の変数。右辺の 0.05f は float 型の定数。問いは rate 自体の種類を問うている。
Q4. float 型の定数として正しいものはどれか。
ア. 3.14
イ. 3.14f
ウ. "3.14"
エ. 3
正解:イ
末尾に f をつけると float 型の定数になる。何もつけない 3.14 は double 型。
Q5. 文字型定数に当たるものはどれか。
ア. 'A'
イ. "A"
ウ. 65
エ. char c = 'B';
正解:ア
シングルクォートで囲んだ1文字が文字定数。"A" はダブルクォートなので文字列定数。65 は整数定数。char c = 'B'; は変数宣言。
Q6. 次のコードで画面に表示される文字はどれか。
#include <stdio.h>
int main(void)
{
char c = 'A' + 1;
printf("%c", c);
return 0;
}
ア. B
イ. A1
ウ. 66
エ. エラー
正解:ア
'A' は ASCII コードで 65。65 + 1 = 66 は 'B' に対応する。%c で文字として表示されるので B が出力される。
Q7. 8進数リテラルとして正しい表現はどれか。
ア. 0x20
イ. 0b100
ウ. 0755
エ. 8.0
正解:ウ
先頭に 0 をつけると 8進数リテラルになる。0x は 16進数。0b はこの授業で扱う規格(C89〜C99)では使えない。