C言語には様々な演算子があります。
ここでは、今まで説明をしていなかった演算子について説明します。
演算子
既に説明した演算子には、四則演算に使用したものや条件分岐や繰り返しの条件式に使用したものなどがあります。
その他にも、変数のアドレスを調べる「&」やポインタの「*」も演算子です。
実は、それら以外にもたくさんの演算子があります。
三項演算子
三項演算子を使うと、条件分岐をしながら、簡単な処理をすることができます。
よく利用するのが、代入や表示の時に、三項演算子を使って条件に応じて、値の代入や表示をするというものです。
#include <stdio.h>
int main(void)
{
int a;
scanf("%d", &a);
printf("aの値は%d\n", a < 0 ? 0 : a);
return 0;
}
実行すると、入力が正の値の時はそのまま表示し、負の値の時は0を表示します。
三項演算子は「a < 0 ? 0 : a」の部分です。
書き方は、条件式を書いたあとに「?」を書き、次に条件式が真の時の処理を書いたら「:」を書いて、最後に条件式が儀の時の処理を書きます。
三項演算子は便利なものですが、使いすぎると分かりにくソースコードになりやすいため、三項演算子を絶対に使わないという人もいます。
なので、使う場合は考えて使いましょう。
ビット演算子
コンピュータ上で、全ての情報はビットというもので表します。
なので、数字や文字などのデータもビットで表します。
ビットに関する説明をここではしませんが、このビットを操作する演算子がC言語には存在します。
#include <stdio.h>
int main(void)
{
int a = 1;
int b = 0;
printf("AND: a & b = %d\n", a & b);
printf("OR: a | b = %d\n", a | b);
printf("XOR: a ^ b = %d\n", a ^ b);
printf("INVERT: ~a = %d\n", ~a);
printf("LEFT SHIFT: a << 1 = %d\n", a << 1);
printf("RIGHT SHIFT: a >> 1 = %d\n", a >> 1);
return 0;
}
ビットを操作する演算子を総称して、ビット演算子と呼びます。
ビット演算子の内容を理解するには、ビットに対する理解が必要不可欠ですが、ここではビットの説明をしないため、分からない場合は説明を飛ばしてください。
それぞれの演算子の意味はこの通りです。
- 論理積 &
- 論理和 |
- 排他的論理和 ^
- ビット反転 ~
- 左シフト »
- 右シフト «
左シフトと右シフトは、演算子の右側に、シフトさせるビットの数字を書きます。「a « 1」とすれば、1ビット左に動かし、動かして空いたビットには、0が入ります。
演算子の優先順位
全ての演算子には計算の順番に優先順位があります。
例えば、足し算や引き算よりも掛け算や割り算が優先的に計算されるのは、掛け算や割り算の演算子の方が足し算や引き算の演算子の優先順位よりも上にあるということです。
さらに、優先順位の他に結合規則というものもあり、結合規則は、「左から右」や「右から左」のように表し、代入の場合、= の右側の計算結果を = の左側に渡すため、結合規則は「右から左」となります。
優先順位や結合規則を表にまとめました。
優先順位の数字が小さいものほど優先順位が高く、同じ数字の場合、足し算と引き算の組み合わせのように、先に登場したものから計算されます。
優先順位 | 演算子 | 用法 | 結合規則 |
---|---|---|---|
1 | [] | a[b] | 左から右 |
() | a(b) | 左から右 | |
. | a.b | 左から右 | |
-> | a->b | 左から右 | |
++ | a++ | 左から右 | |
-- | a-- | 左から右 | |
2 | ++ | ++a | 右から左 |
-- | --a | 右から左 | |
& | &a | 右から左 | |
* | *a | 右から左 | |
+ | +a | 右から左 | |
- | -a | 右から左 | |
~ | ~a | 右から左 | |
! | !a | 右から左 | |
sizeof | sizeof | 右から左 | |
3 | () | (a)b | 右から左 |
4 | * | a * b | 左から右 |
/ | a / b | 左から右 | |
% | a % b | 左から右 | |
5 | + | a + b | 左から右 |
= | a - b | 左から右 | |
6 | << | a << b | 左から右 |
>> | a >> b | 左から右 | |
7 | < | a < b | 左から右 |
<= | a <= b | 左から右 | |
> | a > b | 左から右 | |
>= | a >= b | 左から右 | |
8 | == | a == b | 左から右 |
!= | a != b | 左から右 | |
9 | & | a & b | 左から右 |
10 | ^ | a ^ b | 左から右 |
11 | | | a | b | 左から右 |
12 | && | a && b | 左から右 |
13 | || | a || b | 左から右 |
14 | ?: | a ? b : c | 右から左 |
15 | = | a = b | 右から左 |
+= | a += b | 右から左 | |
-= | a -= b | 右から左 | |
*= | a *= b | 右から左 | |
/= | a /= b | 右から左 | |
%= | a %= b | 右から左 | |
<<= | a <<= b | 右から左 | |
>>= | a >>= b | 右から左 | |
&= | a &= b | 右から左 | |
^= | a ^= b | 右から左 | |
|= | a |= b | 右から左 | |
16 | , | a, b | 左から右 |
知らない演算子が出てきたと思います。
それらは、こんなものもあるのだなと思ってください。
まとめ
たまに、演算子の優先順位を間違って覚えていて、思っていたように計算ができないということがあります。
うまく計算ができないという時は、演算子の優先順位によって、思っていたように計算ができていないということを疑ってみましょう。