変数の初期化 ・変数は宣言と同時に初期値を設定できる ・(単純)変数の初期値 int iDate = 100; double fValue = 15.8; ・プログラムが読みにくくなる場合があるので乱用はしない。 例 int iValue; int iValue = 10; : → : iValue = 10; ※変数はメモリのゴミ等を拾うことがある。 int iValue; printf("%d". iValue); 配列変数の初期化 ・配列を初期化する場合は{}を使って初期値リストを書く ・配列変数の初期化の例 int piArray[4] = {10, 20, 30, 40}; double pfArray[3] = {11.1, 22.2, 33.3}; char pszTemp[4] = {'A', 'B', 'C', '\0'}; 配列変数の初期化の特例 ・添え字の方が大きい int piArray[9] = {15, 25, 35, 45}; →余った部分には0が入る ・添え字を省略する int PiArray[] = {11, 22, 33}; char pazTemp[] = {'A', 'B', 'C', 'D', '\0'}; →自動的に適切な長さが設定される 文字列の初期化 ・文字型配列専用の初期化 char pszTemp1[80] = ""ABCD"; char pszTemp2[] = "ABCD"; ・添え字の省略には注意する −次の表記は文字列として許されない char pszBad[] = {'A', 'B', 'C', 'D'}; ←これは駄目!! 定数について ・定数は宣言しなくても使える −ただし記号定数は宣言が必要 ・定数にもデータ型がある −文字定数 −文字列定数 −数値定数 文字定数 ・シオングルコーテション(')で囲まれた一文字 'A' 'b' 特別な文字定数(エスケープキー) \n, \t 文字列定数 ・文字定数を連続して記述したもの ・ダブルコーテーション(")で囲まれた文字の "Apple", "b", ""38 ・特別な文字列 長さ0の文字 文字列定数の結合 ・文字列定数を(C言語的に)並べて記述すると一つの文字列定数とみなす "ABCD" "VWXYZ" ↓ "ABCDVWXYZ" 数値定数 ・クォーテーション(引用符)で囲まれていない数値として認識できる文字の列 ・数値定数の例 15 -3 18.75 数値定数のデータ型 ・通常の整数定数 100, 200, -300, ... ・long型の整数定数(末尾にLをつける) 100L, 200L, -300L, ... ・実数定数(小数点以下を記述する) 100.0, 200.0, -300.0, ... 数値定数(整数定数)の基数表現 10進数 何もつけずに数値を記述 [例] 15 8進数 先頭に0をつけて数値を記述 [例] 015(10進数の13) 16進数 先頭に0xをつけて数値を記述 [例] 0x15 (10進数の21) 基数について 10進数 0〜9の10種類の文字を使用 通常使用している数の表現 2進数 0と1の2種類の文字を使用 コンピュータ内部での数の表現 8進数 0〜7の8種類の文字を使用 2進数の3桁を8進数の1桁で表現可能 16進数 0〜9とA〜Fの16文字の種類の文字をしよう 2進数の4桁を16進数の1桁で表現可能 記号定数 ・どの型の定数も記号定数で定義できる ・#defineで記号定数を定義する #define NUM_ARRAY 10 #define CHAR_CHECK 'X' #define STR_START_NSG "PROGRAN STRAT" ・数値定数などは記号定数を用いるとわかりやすくる 記号定数の注意点 ・記号定数は慣例として大文字で定義する ・定数が使える場所ならどこでも記号定数が使える ・文字列の中では記号定数は使えない ・#defineの実態はソーステキストの置換 記号定数を使ったプログラム #include#define NUM_ARRAY 10 //型は自動で決まる void main(void){ int i, piArray[NUM_ARRAY]; //型をあわせる for(i = 0; i < NUM_ARRAY; i++){ piArray[i] = i * i; } for(i = 0; i < NUM_ARRAY; i++){ printf("%d * %d = %d\n", i, i, piArray[i]); } } 列挙定数(列挙型定数) ・関連する記号定数の定義をまとめて行える enum Fruit { APPLE, BANANA, CHERY }; ・列挙定数はデータ型のように使用できる enum Fruit ftuitFavorite; 列挙体の宣言 enum Fruit {APPLE,BANANA,CHERY}; ・枠で囲った部分は値の集合を表す ・enum Fruit型 ・列挙定数には0から始まる連番が与えられてる ・指定すれば値は任意に設定できる enum Fruit { define APPLE 0 APPLE, BANANA, CHERY ⇒ define BANANA 1 }; define CHERY 2 列挙定数(列挙型定数) ・任意に値を設定する場合 enum Fruit{ APPLE, BANANA = 5, CHERY }; APPLEは0、BANANAは5、CHERYは6になる C言語研修(基礎編) 〜演算子〜 演算子とは ・演算(計算)の働きを持った記号 ・C言語にはいろいろな種類の演算子がある −算術演算子 −代入演算子 −関係演算子 −論理演算子 −ビット演算子 演算子の注意点 ・演算子には優先順位がある −複数の演算子を並べて書いた場合には優先順位に従って演算される −優先順位を変えるには()を使用する ・演算子には結合性がある −複数の同じ優先順位の演算子を並べて書いた場合には結合性に従って演算される −結合性を変えるにも()を使用する 算術演算子 ・計算(加減乗除)を行う演算子 演算子 機能 + 加算 - 減算 * 乗算 / 除算 % 剰余 10 % 3 = 1 % 余りを求める 算術演算子 ・算術演算子の優先順位 −+, - より *?%が先に計算される a = 100 + 20 *5; ⇒ aの値は200になる ・算術演算子の結合性 − 左から右に結合する b = 100 / 2 * 10 bの値は500になる 整数演算と実数演算 ・整数演算 −演算の対象がすべて整数の場合 −割り算で小数がでた場合は切り捨てになる ・実数演算 −演算の対象に1つでも実数が含まれている場合 −割り算で小数が出た場合も切捨てされない 代入演算 ・代入を行う演算子 演算子 機能 = 代入 単純代入式 [例] a = 10;の場合 aの値は10になる 多重代入式 [例] a = b = c = 100;の場合 a,b,cの値は100になる 多重代入演算子 ・計算と代入を同時に行う演算子 演算子 機能 += 加算代入 -= 減算演算 *= 乗算演算 /= 除算演算 %= 剰余演算 多重代入演算子 ¥多重代入演算子の使用例 a += 100; → aの値は100加算される a = a + 100;のこと b *= 3 → bの値は3倍される b = b * 3;のこと ・プログラムが読みにくくなる場合もあるので乱用しない インクリメント演算子とデクリメント演算子 ・1だけ加算する演算子(インクリメント演算子) ・1だけ減算する演算子(デクリメント演算子) 演算子 機能 ++ 1加算(インクリメント) -- 1減算(デクリメント) インクリメント演算子とデクリメント演算子 ・インクリメント演算子の使用例 i++; → iの値は1加算される ++i; i = i + 1;のこと ・デクリメント演算子の使用例 i--; → iの値は1減算される --i; i = i - 1;のこと ※変数にしかつけることができない 前置した場合と後置した場合で演算のタイミングが異なる 前置した場合 先加算(先減算)で演算を行う [例] b = ++a; の場合 ++a;を実行してから b = a; 後置した場合 後加算(先減算)で演算を行う [例] b = a++; の場合 b = a;を実行してから a++; 関係演算子 ・2つの値を比較する演算子 演算子 機能 < 小さい <= 小さいか等しい > 大きい >= 大きいか等しい == 等しい != 等しくない 関係演算子 ・主に条件判断で使用する if( a < b )〜 if( a == b )〜 if( a != b )〜 真(TRUE)と偽(FALSE) −真と葉条件をみたしていること −真と葉条件をみたしていること 論理演算子 論理演算を行う演算子 演算子 機能 ! 否定(NOT) && 論理積(AND) || 論理和(OR) 論理演算子 否定 条件を満たしていなけければ良い (NOT) (条件を反転させる) 論理席 両方の条件を満たす必要がある (一方だけを充たしていてもムダ) ! → && → || 主に関連演算子の演習結果に対してしよいうそち「 優先順位 ! → && →||の順に処理あされ ビット演算子 Q 【論理演算子の評価順序】 次のようなコードを見たことがある。評価順序の問題はないのか? if (((c1 = getchar()) >= 0x80) && ((c2 = getchar()) >= 0x80)) { /* EUC漢字コードの処理 */ } -------------------------------------------------------------------------------- A C言語のほとんどの演算子は評価順序が不定であるという仕様になっていますが、少しだけ例外のものがあります。論理演算子はその例外であり、常に左から右に評価されることが保証されています。 従って、このコードの場合は、 && の左側にある ((c1 = getchar()) > 0x80) という式がまず評価されることが間違いないため、 c1 と c2 は期待した順序の値が入ることになります。 文字列に対する演算は関数をしようすり 移入をこにう strocpy() strcat() stracmp() strat() 単項演算子 シンボル 名前 - 算術否定演算子 ~ 補数演算子 ! 否定演算子 * 間接演算子 & アドレス演算子 sizeof sizeof演算子 + 単項プラス演算子 ++ 単項インクリメント演算子 -- 単項デクリメント演算子 2項演算子 シンボル 名前 * 乗算演算子 / 除算演算子 % 剰余演算子 + 加算演算子 - 減算演算子 << >> シフト演算子 < > <= >= == != 関係演算子 & | ~ ビット演算子 && 論理演算子 || 順次評価演算子 代入演算子 シンボル 名前 = 単純代入 *= 乗算代入 /= 除算代入 %= 剰余代入 += 加算代入 -= 減算代入 <<= 左シフト代入 >>= 右シフト代入 &= ビットごとのAND代入 ^= ビットごとの排他的OR代入 |= ビットごとのOR代入