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;
}