C言語を勉強したときにまとめたノウハウ集。
・制御文 TRUE = 0以外 FALSE = 0 NULL = 0 EOF = 負の整数 (通常は-1) if文、while文等は0以外(TRUE)の時に処理が実行される。 例1: char ch; ch = getche(); while(ch!='q') ch = getche(); printf("qが入力されました"); 例2: if(i) if(j) printf("iとjは真"); else printf("iは真"); /* このelse文はif(j)文に対するelse。(字下げが紛らわしいが) */ 演算子の優先順位 高 ( ) [ ] -> . ↑ ! ~ + - ++ -- (型キャスト) * & sizeof │ * / % │ + - │ << >> │ < <= > >= │ == != │ & │ ^ │ | │ && │ || │ ?: ↓ = += -= *= /= など 低 , ・インクリメント演算子/デクリメント演算子 インクリメント i = i + 1 を i++ と記述することができる デクリメント j = j - 1 を j-- と記述することができる 例1: i = 10; j = i++; /* jに代入してからインクリメントされる */ printf("i=%d j=%d",i,j); /* 「i=11 j=10」が表示される */ 例2: i = 10; j = ++i; /* iをインクリメントしてからjに代入する */ printf("i=%d j=%d",i,j); /* 「i=11 j=11」が表示される */ 例3: max = 1; count = 10 * max++; printf("count=%d max=%d",count,max); /*「count=10 max=2」が表示される */ ・ビットごとの演算子 & … AND | … OR ^ … XOR (排他的論理和) ~ … 1の補数 (0と1を反転) 例1: int i = 100; i = i ^ 21987; printf("XORの値は%d",i); /* 「XORの値は21895」が表示される */ /* 0101 0101 1110 0011 (10進数の21987) ^ 0000 0000 0110 0100 (10進数の100) ─────────── 0101 0101 1000 0111 (10進数の21895) */ 例2: char ch = 'a'; ch = ~ch; /* 1の補数(ビット反転) */ ・シフト演算子 値 << ビット数 値 >> ビット数 例: unsigned short u; u = 45678; /* 1011 0010 0110 1110 */ u = u << 1; /* 1ビット左へ 0110 0100 1101 1100 (一番左の1は削られる) */ u = u >> 1; /* 1ビット右へ 0011 0010 0110 1110 (一番左には0が入る) */ ・条件演算子 if文の代わり"?"を使用できる。 変数 = 条件 ? 式1(真): 式2(偽); 例1: int i = rand() % 2 ? 1 : 0; if(i) printf("表"); else printf("裏"); 例2: rand()%2 ? printf("表") : printf("裏"); ・代入演算子 例: i = j = k = 1; /* i,j,kに1を代入 */ a += 5; /* a = a + 5 */ b &= c; /* b = b & c */ i <<= 3; /* 2を3回掛ける */ ・代入文での型変換 例1: int i; char ch; i = 1000; ch = i; printf("%d",ch); /* 「-24」と表示される(下位8ビットのみコピー) */ 例2: int i; float f; f = 1234.0098; i = f; printf("%f %d",f,i); /* 「1234.0098 1234」と表示される */ 例3: short int si; long int li; li = 100000; si = li; printf("%hd",si); /* 「-31072」と表示される */ 例4: int i; long double ld; ld = 10.0; i = ld; printf("%d",i); /* 「10」と表示される */ 例5: float f; f = 10 / 3; printf("%f",f); /* 「3.000000」と表示される */ ・カンマ演算子 例1: for(i=0, j=0; i+jj ? i : j int main(void) { printf("%d\n", MAX(1,2)); printf("%d\n", MAX(100 && -1,0)); /* ←これは間違い (例3が正しい使い方) */ return 0; } 例3: /* #defineを以下のように修正すると、例2を使用できる */ #define MAX(i,j) ((i)>(j)) ? (i) : (j) int main(void) { printf("%d\n", MAX(1,2)); printf("%d\n", MAX(100 && -1,0)); /* ←これは正しい */ return 0; } ・#演算子 例: #define MKSTRING(str) # str int main(void) { int value; value = 10; printf("%s の値は %d です",MKSTRING(value), value); /* 「value の値は 10 です」と表示される */ /* #演算子は、引用符付きの文字列に変換する */ return 0; } ・##演算子 例: #define output(i) printf("%d %d ", i ## 1, i ## 2) int main(void) { int count1,count2; int i1,i2; count1 = 10; count2 = 20; i1 = 99; i2 = -10; output(count); output(i); /* 「10 20 99 -10」 と表示される */ return 0; }