C言語の演算子

### 算術演算子
+: 加算
-: 減算
*: 乗算
/: 除算
%: 余り

int main(void){
	int a, b, n;
	double d1, d2, dd;

	a = 100; b = 30;

	n = a + b; printf("%d\n", n);
	n = a - b; printf("%d\n", n);
	n = a * b; printf("%d\n", n);
	n = a / b; printf("%d\n", n);
	n = a % b; printf("%d\n", n);

	d1 = 90.0; d2 = 40.0;
	dd = d1 / d2; printf("%f\n", dd);
	return 0;
}

$ ./dev
130
70
3000
3
10
2.250000
intとdoubleなど混合計算も可能。その場合、表現能力の高いデータ型(double)に合わせて計算される。

### 関係演算子と等価演算子
<: 小さい <=: 小さいか等しい >: 大きい
>=: 大きいか等しい

等価演算子
==: 等しい
!=: 等しくない
※[C = 10]は代入、[C == 10]は等しいなので、注意が必要

### 論理演算子
!: NOT
&&: AND
||: OR

### インクレメント・デクレメント演算子
++: ++a(先加算) or a++(後加算);
–: –a(先加算) or a–(後加算);

先加算とは、先に1を足してから代入
e.g.
a = ++b  ↓
b = b+1; a = b

後加算とは、先に代入してから加算処理
e.g.
a = b++;
a = b; b=b++;

### 代入演算子
単純代入演算子: =
複合代入演算子: +=, -=, *=, /=, %=, &=, ^=, |=, <<=, >>=
a = b = 20
a *= b + c; ↓
a = a *(b + c); と解釈される

### キャスト演算子

int idt;
double ddt = 123.456;

idt = ddt;
printf("idt=%d ddt=%f\n", idt, ddt);

doubleからintへの変換で小数点以下のデータが失われる為、warningが出ることがある。
キャスト演算子では、 idt = (int)ddt; と言うように書く
warningを消す目的だけでなく、整数部分のみ取得したい場合にも使われる

### 条件演算子(三項演算子?)
条件式 ? 式1 : 式2
e.g.
b = (a < 10) ? 200: 300; ### ビット演算子 ビット単位のデータ操作をする &: ビット毎のAND a = b & 0x7FFF |: ビット毎のOR a = b | 0x8000 ^: ビット毎のXOR a = b ^ 0x000F ~: ビットの反転 a = ~a; <<: 左シフト a = a << 2; >>: 右シフト a = a >> 2;

int main(void){
	int a = 0x00005555;
	int b = 0x000000FF;
	int c;

	printf("a=%08X\n", a);
	printf("b=%08X\n", b);
	c = a & b; printf("&=%08X\n", c);
	c = a | b; printf("|=%08X\n", c);
	c = a ^ b; printf("^=%08X\n", c);
	c = ~a; printf("~=%08X\n", c);
	return 0;
}

$ ./dev
a=00005555
b=000000FF
&=00000055
|=000055FF
^=000055AA
~=FFFFAAAA
※[%08X]は、先行0埋め、8文字幅の16進数
※負の数の右シフトはC処理系によって動作が異なることがある

### sizeof演算子
引数のサイズをバイト数で返す。

int main(void){
	int a, b[10];

	printf("%d\n", sizeof a);
	printf("%d\n", sizeof b);
	printf("%d\n", sizeof(char));
	printf("%d\n", sizeof(short int));
	printf("%d\n", sizeof(int));
	printf("%d\n", sizeof(long int));
	printf("%d\n", sizeof(float));
	printf("%d\n", sizeof(double));
	return 0;
}

$ ./dev
4
40
1
2
4
8
4
8

### 演算子の優先順位
優先順位の高い演算子が先に計算される
* / % は + – より優先処理される
()を使うと、括弧の内部を先に計算する
同じ優先順位の演算子が連続した時は、左から(あるいは右)処理を行う
a = b = 10; // この場合は、右から処理
結合規則で右からは前置(++, –)、キャスト(型名)、条件(?:)、代入(=など)。それ以外は左から処理

ビット演算子は状態管理やサブネットマスクなど多種多様に使われているとのこと。実際にビット演算子を使って作らないと、いまいち頭に入ってきませんな。