式と演算

スポンサーリンク

算術演算子

算術演算子には次のようなものがあります。
演算子の優先順位は一般の四則演算と同じです。

演算子説明
+単項プラス+ 55
-単項マイナス- 5-5
+加算2 + 35
-減算2 - 3-1
*乗算2 * 36
/除算7 / 32
%剰余7 % 31
#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 == 30
!=非等価4 != 31
>大なり4 > 31
<小なり4 < 30
>=以上4 >= 31
<=以下4 <= 30

== 演算子と != 演算子は,値の等価性を調べます。
参照の等価性を調べるには,別の章で紹介するポインタが利用できます。

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

論理演算子

論理演算子には次のようなものがあります。

演算子説明
&&AND1 && 00
||OR1 || 01
!NOT!01
#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 の評価はもはや必要ないので行いません。

ビット演算子

ビット演算用の演算子には次のようなものがあります。

演算子説明
&AND3 & 22
^XOR2 ^ 13
|OR3 | 23
~NOT~0xffff0xffff0000
<<左シフト1 << 38
>>右シフト8 >> 31
#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;33
a = n++;32
a = --n;11
a = n--;12

代入演算子

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 と同じ効果を持ちます。

+=  -=  *=  /=  %=  &amp;=  ^=  |=  <<=  >>=
#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 */
スポンサーリンク