式と演算
算術演算子
算術演算子には次のようなものがあります。
演算子の優先順位は一般の四則演算と同じです。
演算子 | 説明 | 例 | 値 |
---|---|---|---|
+ | 単項プラス | + 5 | 5 |
- | 単項マイナス | - 5 | -5 |
+ | 加算 | 2 + 3 | 5 |
- | 減算 | 2 - 3 | -1 |
* | 乗算 | 2 * 3 | 6 |
/ | 除算 | 7 / 3 | 2 |
% | 剰余 | 7 % 3 | 1 |
#include <stdio.h>
int main(void)
{
int a = 2, b = 3, c = 4;
printf("%d\n", -a); /* 出力: -2 */
printf("%d\n", a * b); /* 出力: 6 */
printf("%d\n", -a + b * c); /* 出力: 10 */
return 0;
}
演算の優先順位を変えるには括弧 (...) を使います。
1 + 2 * 3 /* 7 */
(1 + 2) * 3 /* 9 */
整数型同士の除算は常に切り捨てられます。
ただし,少なくとも一方のオペランドが実数型であれば,型の昇格によって結果は実数値となります。
10 / 3 /* 3 */
10.0 / 3 /* 3.333... */
10 / 3.0 /* 3.333... */
関係演算子
大小比較,同値比較を行う関係演算子には,次のようなものがあります。
演算子 | 説明 | 例 | 値 |
---|---|---|---|
== | 等価 | 4 == 3 | 0 |
!= | 非等価 | 4 != 3 | 1 |
> | 大なり | 4 > 3 | 1 |
< | 小なり | 4 < 3 | 0 |
>= | 以上 | 4 >= 3 | 1 |
<= | 以下 | 4 <= 3 | 0 |
== 演算子と != 演算子は,値の等価性を調べます。
参照の等価性を調べるには,別の章で紹介するポインタが利用できます。
C には論理型が存在しないため,真を 0 以外の値,偽を値 0 で表します。
関係演算の結果の値も,1 または 0 になります。
#include <stdio.h>
int main(void)
{
int a = 4, b = 3;
if (a == b) { printf("a == b\n"); }
if (a != b) { printf("a != b\n"); }
if (a > b) { printf("a > b\n"); }
if (a < b) { printf("a < b\n"); }
if (a >= b) { printf("a >= b\n"); }
if (a <= b) { printf("a <= b\n"); }
return 0;
}
a != b
a > b
a >= b
論理演算子
論理演算子には次のようなものがあります。
演算子 | 説明 | 例 | 値 |
---|---|---|---|
&& | AND | 1 && 0 | 0 |
|| | OR | 1 || 0 | 1 |
! | NOT | !0 | 1 |
#include <stdio.h>
int main(void)
{
int a = 2, b = 3, c = 4;
if (!(a == b)) { printf("a != b\n"); }
if (a < b && b < c) { printf("a < b < c\n"); }
return 0;
}
a != b
a < b < c
&& 演算子,|| 演算子は短絡評価を行います。
例えば,式 A && B で A が偽のとき,式 B の評価はもはや必要ないので行いません。
ビット演算子
ビット演算用の演算子には次のようなものがあります。
演算子 | 説明 | 例 | 値 |
---|---|---|---|
& | AND | 3 & 2 | 2 |
^ | XOR | 2 ^ 1 | 3 |
| | OR | 3 | 2 | 3 |
~ | NOT | ~0xffff | 0xffff0000 |
<< | 左シフト | 1 << 3 | 8 |
>> | 右シフト | 8 >> 3 | 1 |
#include <stdio.h>
int main(void)
{
int a = 1, b = 2, c = 3, d = 8, e = 0xffff;
printf("%08x\n", c & b); /* 出力: 2 */
printf("%x\n", b ^ a); /* 出力: 3 */
printf("%x\n", c | b); /* 出力: 3 */
printf("%08x\n", ~e); /* 出力: ffff0000 */
printf("%x\n", a << c); /* 出力: 8 */
printf("%x\n", d >> c); /* 出力: 1 */
return 0;
}
インクリメント/デクリメント
インクリメント演算子 ++ は変数の値を 1 だけ増やす演算子です。
デクリメント演算子 -- は変数の値を 1 だけ減らす演算子です。
演算子を前置した場合は増減後の値を,後置した場合は増減前の値を評価結果とします。
式 | n の値 (初期値 2) | a の値 |
---|---|---|
a = ++n; | 3 | 3 |
a = n++; | 3 | 2 |
a = --n; | 1 | 1 |
a = n--; | 1 | 2 |
代入演算子
C における代入は代入演算子 = を用いた式として記述され,値を持ちます。
代入演算子 = は右結合であり,右から左へ評価されます。
例えば,a = b = c という式は a = (b = c) と評価されます。
また,代入演算子は順次演算子に次いで低い優先度を持ちます。
#include <stdio.h>
int main(void)
{
int a = 2, b = 3;
if (a = b) { printf("hello\n"); }
return 0;
}
hello
次のような複合代入演算子も利用可能です。
複合代入演算子 a op= b は,a = a op b と同じ効果を持ちます。
+= -= *= /= %= &= ^= |= <<= >>=
#include <stdio.h>
int main(void)
{
int a = 2;
a += 3;
printf("%d\n", a); /* 出力: 5 */
return 0;
}
キャスト
型変換を行うキャスト演算子は,(int) のように (型名) と書きます。
double d = 3.14;
int n = (int) d;
条件演算子
条件演算子 ?: は,条件式 ? 式1 : 式2 という形で用いる三項演算子です。
条件式が真の場合には 式1 を,偽の場合には 式2 を評価結果とします。
max = a > b ? a : b; /* a > b が真ならば a,偽ならば b を代入 */
sizeof 演算子
sizeof 演算子はデータ型のサイズ (バイト数) を調べる演算子です。
sizeof(型名) または sizeof 変数名 と書いて用います。
sizeof(char) /* 1 */
順次演算子
順次演算子 , は,複数の式を左から順に評価し,最後の式を評価結果とします。
すべての演算子の中で最も優先度が低い演算子です。
int a = 1, b;
b = (a += 1, a *= 2, a += 3, a++);
printf("%d\n", a); /* 8 */
printf("%d\n", b); /* 7 */