情報処理II

情報処理Ⅱ
第2回
2005年10月14日(金)
授業の進め方
構造体
プリプロセッサ
指令
その他の型
ライブラリ関数
識別子
算術型
制御文
演算子
2年以降で
さらに学習・習熟
ファイル入出力
配列・文字列
ポインタ
関数
変数の
有効範囲
プログラムの作成・
コンパイル・実行
2
本日学ぶこと

コラッツの問題のプログラムで,変数の宣言を
int x = 3;
としたが,これ以外にどんな書き方があるのか?


xは「識別子」
intは「型」
3
識別子(Identifier)

プログラムの中でさまざまな対象を識別するために用いられ
る「名前」のこと

対象の例
• 変数
• 関数
• 型定義
• 構造体のタグやメンバ
• 列挙体と列挙定数
• ラベル など
4
識別子の命名規則(1)

最初の文字は,英字または下線記号(_)
2文字目以降は,英字,下線記号または数字
英字は大文字と小文字が区別される

例




○ int x, variable, Variable, x_y, _, _ _;
× int 0x, <variable>, x-y;
5
識別子の命名規則(2)

「予約語」はNG


auto, break, case, char, const, continue,
default, do, double, else, enum, extern,
float, for, goto, if, int, long, register,
return, short, signed, sizeof, static,
struct, switch, typedef, union, unsigned,
void, volatile, while
例


× int int;
○ int intchar;
6
識別子の命名規則(3)

「予約済み識別子」もNG



printfなど,既に定義されている名前
下線記号から始まるもの(例外はあるが,避けておくほうが無
難)
例


× int printf, NULL;
○ int Printf;
7
識別子の命名方針

よく使う変数名



変数は,1文字~数文字.もしくは,その用途がわかるもの
にする.


a, b, c, msg, from, to, filename
関数名は,その機能がわかるものにする.長くなる.



ループ用変数: i, j, k
座標: x, y
transform_rectangle_to_circle
transformRectangleToCircle
ラベルや定数は,大文字と下線のみを使用する

NULL, EOF, _ _LINE_ _
8
型(type)

変数や値がどのような種類の情報を持っているか


C, C++, Javaなどでは,変数宣言時に型を決めなければ
ならない
型の違いの例


int i = 1;
float f = 1.0;
char c = '1';
char *p = "1";
相互に変換できる?
(整数の「1」)
(実数の「1」)
(文字の「1」)
(文字列の「1」)
9
型の分類

オブジェクト型







算術型 ⇒ 本日のテーマ
配列型 ⇒ 後日しっかり学ぶ
構造体型 ⇒ 後日しっかり学ぶ
共用体型
ポインタ型 ⇒ 後日しっかり学ぶ
派生型
関数型
不完全型
10
算術型(よく使う)

char : 文字,小さな範囲の整数


int : 整数


語源…long integer
float : 実数


語源…integer
long : より大きな範囲の整数


語源…character
語源…floating point(浮動小数点)
double : より大きな範囲の実数

語源…double precision(倍精度)
11
算術型(あまり使わない)

たまに見かけるかも






short
unsigned char
signed char
unsigned int
unsigned long
long double

なるべく使わない








short int
long int
long long
long long int
signed
unsigned
signed int
char signed
12
整数型の範囲

整数型(char, int, longなど)のとりうる値は





その型を何バイト(何ビット)で表現するか
符号の有無
で決まる.
nビットなら,2進数を用いて2n個の数値を表現できる.
どの整数型も,0を表現できる.
13
signedとunsigned

signed (符号あり)




unsigned (符号なし)




負の数をとり得る整数
1 0 0 0 0 0 0 0
最小は,-2n-1
0 1 1 1 1 1 1 1
最大は,2n-1-1
負の数をとらない整数
0 0 0 0 0 0 0 0
最小は,0
1 1 1 1 1 1 1 1
最大は,2n-1
n=8の
ビットパターン
signedもunsignedも書かなかったら…


int, short, longでは「符号あり」と決まっている
charでは処理系に依存
14
整数型の範囲の例

例1: int型が4バイト(32ビット)なら,



例2: char型は常に1バイト(8ビット)



-2147483648≦int型の値≦2147483647
0≦unsigned int型の値≦4294967295
char=signed charなら,-128≦char型の値≦127
char=unsigned charなら,0≦char型の値≦255
注意

char以外の整数型のバイトサイズは処理系に依存
• 演習室の環境は,intとlongがともに4バイト.
• intが2バイトという処理系も多い.
15
範囲を越えるとどうなるか?

signed char型変数に13*13を格納すると?
16
浮動小数点とは?

科学技術計算では,602000000000000000000000 を
6.02×1023 と書く.


(符号)仮数×底指数による表現を,浮動小数点形式という.




計算例:(6.02×1023)×10 = 6.02×1024
ただし1≦仮数<底,指数は整数(0や負でもよい)
「底」は「基数」とも言う.
計算例:(6×102)×(6×102) = (6×6)×102+2 =
36×104 = 3.6×105
2を底とする浮動小数点形式で表されることが多い.

例:-0.625 (=1/2+1/8)は,「-」1.01(2) * 2-1
17
実数型の範囲(1)

仮数と指数をそれぞれ何ビットで表現するかによって,取り
得る値が決まる.



単精度の例:符号1ビット+仮数部23ビット+指数部8ビット
=32ビット(4バイト)
倍精度の例:符号1ビット+仮数部52ビット+指数部11ビット
=64ビット(8バイト)
ビット数の制約があるため,あらゆる実数を表すことはできな
い.

表現できない数の例:101000 ,√2,π
18
無限小?

1から始めて2でどんどん割っていくと,


いくらでも小さい数ができる?
いずれは0になる?
19
1なのに,1でない?


for文を用いて,0, 0.1, 0.2, ..., 1.0 を取り出す.
プログラミングの心がけ


(最善) 実数型はループ用変数にしない.
(次善) != ではなく,> や < を用いて終了判定をする.
20
定数の表現方法

整数定数








123, 0123, 0x123
-123
long型
123U, 123L, 123UL
浮動小数点定数

8進数値
16進数値
( 0~9, a~f )
int型
unsigned long型
unsigned int型
3.14, -3.1415926
double型
.14, 3.
6.02×1023
float型
6.02E23
6.63E-34F, 6.62606876E-34L
long double型
上記の英字は,大文字でも小文字でもよい.
21
異なる型の値同士の計算


1/3 と 1.0/3 と 1/3.0 と 1.0/3.0 は同じ値?
演算において,大きい範囲の型に揃えられる.





int > short, int > char (汎整数拡張)
long double > double > float >
long long > long > int (暗黙の型変換)
unsigned > signed
変数に値を格納する(代入する)ときは,変数の型に応じて
型変換が行われる.
プログラミングの心がけ


unsignedとsignedの整数値を混在させて演算しない.
1/3は,0
22
まとめ



変数や関数などの名前は「識別子」と呼ばれ,そのルール
(命名規則)や慣用的な使われ方がある.
「数」には「整数」と「浮動小数点数」がある.
表現できる数値には制限がある.



「整数」といっても,いくらでも大きな整数値が使えるわけでは
ない.
「実数」といっても,いくらでも精密な実数値が使えるわけでは
ない.
オーバーフロー,計算誤差,型変換に注意.
23