プログラミング実習 I 03 変数と式 人間システム工学科井村誠孝 m.imura@kwansei.ac.jp
3.1 変数と型
変数とは p.60 C 言語のプログラム中で, 入力あるいは計算された数や文字を保持するには, 変数を使用する. 名前がついていて値を入れられる箱, というイメージ. 変数定義 : 変数は変数定義 ( 宣言 ) してからでないと使うことはできない. 代入 : 変数には値を代入できる. 代入できる値の範囲や精度は, 変数の型によって決まる. 参照 : プログラム中に変数名が現れると, 格納されている値に置き換わる.
フローチャート p.61 アルゴリズムを視覚化したもの #include <stdio.h> int main(void) { int a, b, c; scanf("%d", &a); scanf("%d", &b); c = a + b; if (c < 0) { printf( c は負です n"); } return 0; } はじめ データ a,b を入力 c a+b c < 0? Y c は負です と表示 おわり N
変数名の制限 p.62-63 教科書 p.62-63を参照してください. Q. 次のうち, 変数の名前として使えないのは? 1. when 2. if 3. 2days 4. a12345 5. hoge!hoge 6. fuga_fuga 7. ABC ( 注 : 全角文字 ) 8. (* ー )v
変数の型 p.63 char int 整数 表現できる数の範囲が異なる 前に unsigned をつけると, 正の数のみ扱う char 型変数は文字 ( アルファベット, 数字, 記号 ) を格納する. float double 実数 ( 浮動小数点数 ) 範囲 精度が異なる 表現できる値の範囲や精度 トレードオフ 占有するメモリ
整数型と格納可能な値の範囲 p.64 型名 ビット数 最小値 最大値 char 8-2 7 =-128 2 7-1 =127 short int 16 int long int 32 long long int 64-2 15 =-32768-2 31 =-2147483648-2 63 =-9223372036854775808 2 15-1 =32767-2 31-1 =2147483647-2 63-1 =9223372036854775807
ビットとバイト p.64 ビット (bit) コンピュータが扱う情報の最小単位. 二つの選択肢から一つを特定する (=0か1のいずれか決める ) のに必要な情報量が1ビット. バイト (byte) ( 一般的には ) 8ビット = 1バイト 1バイトで表すことができる選択肢の数は? 2 2 2 2 2 2 2 2 2 8 =256
実数 ( 浮動小数点数 ) p.65 コンピュータで実数 ( ただし有効桁数が決まっている ) を扱う際の表現方法. 絶対値が小さな数から大きな数まで, 先頭の桁からの正確さ ( 有効桁数 ) を同程度に保って情報を保持できる. C 言語では実数を保持する変数の型として,float と double が用意されている. 型 メモリ量 仮数部の桁数 (10 進数換算 ) 指数部の範囲 float 4 6 10-37 ~10 38 double 8 15 10-307 ~10 308
float の内部フォーマット p.65 float は一般的に,IEEE754 標準の binary32 形式 (32 ビット単精度浮動小数点数 ) で表現される. 符号部 : 1 ビット 仮数部 : 23 ビット 指数部 : 8 ビット 2.56 10 2 仮数部 指数部 double の場合 : 符号部 1 ビット, 指数部 : 11 ビット, 仮数部 : 52 ビット
参考 : 浮動小数点数各部の詳細 符号部 正ならば 0, 負ならば 1 となる. 指数部 実際の値に, ある固定値 emax (float の場合 127) を加算して表す ( バイアスされた表現 ). 0 と 255 は特殊な値として予約されているため, 表現できる指数は -126 から +127 である. 2 の補数による負の整数の表現とは異なる. 仮数部 最初の 1 ビットは常に 1 であるから省略され, 実質 24 ビットの精度を持つ ( ケチ表現 ; economized form).
文字 p.67 文字は char 型で表される 文字 1 つ 1 つに数字が対応している ( 文字コード ) 例 : A の文字コードは 65 'A' とすると, その文字の文字コードが得られる とアルファベット 1 文字 = 特殊記号 ( エスケープシーケンス ) n 改行 / t タブなど エスケープシーケンスは教科書の付録表を見る 当面, ひらがな カタカナ 漢字は忘れてください. char 型は 1 バイトしか格納できない. 日本語特有の文字は 2 バイト ( 以上 ) の領域が必要.
文字 を表示 / 文字コード を表示 p.70 #include <stdio.h> int main(void) { char c = 'A'; printf("%c %d n", c, c); return 0; } ここに注目同じ変数 c を異なる型で表示
定数の型 p.73 整数 int 型として扱われます. 16 進数表記 : 先頭に0xを付ける. 8 進数表記 : 先頭に0を付ける. 浮動小数点数 double 型として扱われます. 整数だけど浮動小数点数として扱いたい場合は,.0(. だけでもよい ) を末尾に付加する. 例 : 100.0 float 型にしたい場合は, 末尾にfを付ける. 例 : 3.14f
参考 : 2 進数 -10 進数 -16 進数の対応 2 進数 10 進数 16 進数 0 0 0 1 1 1 10 2 2 11 3 3 100 4 4 101 5 5 110 6 6 111 7 7 2 進数 10 進数 16 進数 1000 8 8 1001 9 9 1010 10 A 1011 11 B 1100 12 C 1101 13 D 1110 14 E 1111 15 F 10000 16 10
画面出力 / キーボード入力 p.74-75 printf( フォーマット, 変数, 変数,...); scanf( フォーマット, & 変数, & 変数,...); ただし,scanf であっても, 文字列 (char 配列 ) のときは & を付けない ( そのうち出てくるだろう ). printf と scanf のフォーマットはほとんど同じだが, double 変数のときは異なるので要注意. フォーマット文字列の詳細は参考書を見よ. double d; scanf("%lf", &d); printf("%f n", d);
主な printf のフォーマット文字列 p.75 %d: int 型変数 ; 整数 %c: int 型変数 ; 単一文字 %s: char 型配列 ; 文字列 %f: double 型変数 ; 浮動小数点数 %e: double 型変数 ; 科学的表記法 %g: double 型変数 ; 最適な表記法を自動選択 フォーマット文字列の指定と, 引数として与える変数の型が一致していないと, 予期せぬ内容が出力される. 例 : double d = 1.0; printf("%d n", d);
浮動小数点数の表示 p.75 printf のフォーマット文字列で以下を指定可能 通常の表記 (%f) / 指数表記 (%e) / 自動選択 (%g) 桁数および精度を指定可能 double d; printf("%xx.yyf",d); printf("%xx.yye",d); XX: 全体の文字数を指定 ( フィールド幅 ) YY: 小数点以下の桁数を指定 ( 精度 ) 省略した場合は 6 桁になる.
浮動小数点数の表示 : 例 p.75 #include <stdio.h> int main(void) { double e; e = 99.123456789012345; printf("%f n", e); printf("%.10f n", e); printf("%20.10f n", e); printf("%e n", e); printf("%.10e n", e); printf("%20.10e n", e); 出力結果 10 桁 99.123457 20 文字分 99.1234567890 99.1234567890 9.912346e+01 9.9123456789e+01 9.9123456789e+01 } return 0;
ついでに : 主な scanf のフォーマット文字列 %d: int 型変数 ; 整数 %c: char 型変数 ; 単一文字 %s: char 型配列 ; 文字列 ( 変数名に & は付けない ) %f: float 型変数 ; 浮動小数点数 %lf: double 型変数 ; 浮動小数点数 注意!! float 型と double 型でフォーマット文字列が異なる
変数の宣言場所 p.78 変数の宣言は { の直後 ( ブロックの先頭 ) でしかで きない. C 言語の仕様. { } でかこまれた部分を ブロック と呼ぶ. ブロックの中で宣言された変数は, そのブロック内のみ 有効. 全てのブロックの外で 宣言すると グローバル 変数 となる. int x; : if (x == 0) { int a = 1; : printf("%d n", a); /* OK */ } printf("%d n", a); /* NG */
変数の初期値 p.79 関数の中で ( つまりブロックの先頭で ) 宣言された変数の初期値は不定です. main() 関数であっても同じです. 変数は必ず初期化することを習慣付ける. ただし, グローバル変数 ( 関数の外で宣言された変数 ) の初期値は0であることが保証されている.
符号付き / 符号無し整数 p.83 char 型名 short int int long int -2 7 =-128-2 15 =-32768 signed unsigned 最小最大最小最大 -2 31 =-2147483648 2 7-1 =127 2 15-1 =32767-2 31-1 =2147483647 0 0 0 2 8-1 =255 2 16-1 =65535-2 32-1 =4294967295
式と演算子
だいたいが式 p.85 C 言語では思っている以上のものを式として扱う. 代入文も式 例 : a = 3 比較の条件も式 例 : a == 3 単なる変数 ( や関数呼び出し ) も式 例 : a 実は定数だけでも式 例 : 3 もちろん, 数学的に式らしい式も式 例 : y = a * x * x + b * x + c
四則演算 p.89 演算子 (operator): 数値や変数に対して何らかの処 理 ( 演算 ) を行うことを表す記号 1 + 2 の + は演算子 演算 数学 C 言語 加算 + + 減算 - - 乗算 * 除算 / 剰余 ( 余り ) % アスタリスク線が 5 本だったり 6 本だったりしますが同じもの
四則演算 p.90 演算子の優先順位に注意. 迷ったら () を付ければよろしい. 整数 / 整数の答えは整数になるので注意. 整数 / 整数の答えを小数点以下まで求めたいときにはどうすればよいか? int a, b; double c; a = 1; b = 3; c = a / (double) b; キャスト : 型の変換 double c; c = 1 / 3; double c; c = 1 / 3.0; double c; c = 1.0 / 3;
演算子の優先順位と結合規則一覧 p.94 高 低 () [] ->. 左から右! ~ ++ -- + - * & (type) sizeof 右から左 * / % 左から右 + - 左から右 << >> 左から右 < <= > >= 左から右 ==!= 左から右 & 左から右 ^ 左から右 左から右 && 左から右 左から右?: 右から左 = += -= *= /= %= &= ^= = <<= >>= 右から左, 左から右 注 : 上から 2 段目 + - は単項演算子 * は間接演算子 & はアドレス演算子
演算子の優先順位 p.94 以下の条件式はどう解釈されるか y+1<x&&y==z+10*x x!=y 演算子の間には優先順位がある 例えば,5 2+3 (5 2)+3 次の順に優先 ( 先に演算 ) される 乗算 除算 加算 減算 比較 論理積 論理和従って, (((y+1)<x)&&(y==(z+(10*x)))) (x!=y)
結合規則とは p.94 以下の計算結果は何になるか 12/5*3 これは当然ながら, (12/5)*3 結合規則は, 同じ優先順位の演算子が連続している場合に, 左側から適用していくか, 右側から適用していくか, を規定する. ほとんどの演算子は左から右
混合演算 p.95 演算は同じ型間で行われる. C 言語の方針 : なるべく効率よいように実行する 型の変換が必要なければ行わない. 1/3 が 0 になる理由はこれ. 異なる型間での演算は, 一方をより広い範囲の値が扱える型に変換して演算がなされる. 整数と浮動小数点数を演算するときは, 整数が浮動小数点数に変換されてから計算が行われ, 結果は浮動小数点数となる. 代入の場合は左辺値に変換される.
キャスト p.98 強制的に型を変換したい キャスト演算子を使う キャスト演算子 : () の中に型名が入っている. 例 (double) うまくいかない例 int i, j; double d; i = 1; j = 3; d = i / j; d は 0 になる. キャストを使う例 int i, j; double d; i = 1; j = 3; d = (double)i / j; d = i / (double)j; d = (double)i / (double)j;