C言語には普段よく使われている四則演算の他、さまざまな演算子があります。
演算子 | 構文 | 説明 |
+ | x + y | xにyを加えます。 |
- | x - y | xからyを引きます。 |
* | x * y | xにyを掛けます。 |
/ | x / y | xをyで割ります。 |
% | x % y | xをyで割った余りです。 |
演算子 | 構文 | 説明 |
++ | ++x | xに+1してxを評価します。(前置演算) |
x++ | xを評価したあとxに+1します。(後置演算) | |
-- | --x | xに-1してxを評価します。(前置演算) |
x-- | xを評価したあとxに-1します。(後置演算) |
前置演算と後置演算の違いは代入演算時や関数の引数に利用した場合など多くの場合に見られます。
例として代入演算時に使用した場合の動作を確認したいと思います。
・サンプルソース(sample0301.c)
#include <stdio.h> int main() { int x = 1; int y; /* 代入演算での評価の違い */ y = ++x; printf("前置演算( y = ++x; )\n"); printf("x = %d\n", x); printf("y = %d\n", y); x = 1; y = x++; printf("後置演算( y = x++; )\n"); printf("x = %d\n", x); printf("y = %d\n", y); return 0; }
・実行結果
C:\dev\c>sample0301 [Enter] 前置演算( y = ++x; ) x = 2 y = 2 後置演算( y = x++; ) x = 2 y = 1 ← インクリメントされる前に代入されている
演算子 | 構文 | 説明 |
& | x & y | 論理積(AND)を行います。 |
| | x | y | 論理和(OR)を行います。 |
^ | x ^ y | 排他的論理和(XOR)を行います。 |
~ | ~x | 否定(NOT)を行います。 |
|
|
|
|
シフト演算子とはビットをずらしていく演算子です。但し、float型、double型、ポインタ型には使用することができません。
数値xに対して左にnビットシフトさせる場合の書式は次のようになります。
x << n
左シフトによるビット変化のイメージは次のようになります。
※2進数において桁が上がっていくことになるので、元の値に対して2倍していくことと同じになります。
x >> n
右シフトの場合は対象となる変数の型が「符号付」の場合と「符号なし」の場合で処理が変わります。
符号なしのときの右シフトは左シフトと同じ処理になります。これらを「論理シフト」と呼び、処理イメージは下図のようになります。
符号付のときは左端のビットが符号の意味を持つため、シフトにより符号が変化しないよう元の値と同じ値で補充されます。このようなシフトは「算術シフト」と呼ばれ、処理イメージは下図のようになります。
※2進数において桁が下がっていくことになるので、元の値に対して1/2倍していくことと同じになります。
演算子 | 構文 | 説明 |
= | x = y | yをxに代入します。 |
+= | x += y | xに(x + y)を代入します。 |
-= | x -= y | xに(x - y)を代入します。 |
*= | x *= y | xに(x * y)を代入します。 |
/= | x /= y | xに(x / y)を代入します。 |
%= | x %= y | xに(x % y)を代入します。 |
&= | x &= y | xに(x & y)を代入します。 |
|= | x |= y | xに(x | y)を代入します。 |
^= | x ^= y | xに(x ^ y)を代入します。 |
<<= | x <<= y | xに(x << y)を代入します。 |
>>= | x >>= y | xに(x >> y)を代入します。 |
演算子 | 構文 | 説明 |
&& | x && y | 論理積(AND)を行います。 |
|| | x || y | 論理和(OR)を行います。 |
! | !x | 排他的論理和(XOR)を行います。 |
|
|
|
論理演算子とビット演算子の違いは、論理演算子の場合その結果がTrue(0以外はすべて1とみなす)またはFalse(0)のどちらかになるという事です。ですから、各オペランドの演算結果を値として取得する場合はビット演算子、真か偽かの判別を行いたい場合は論理演算を使用します。
演算子 | 構文 | 説明 |
== | x == y | xとyは等価である。 |
!= | x != y | xとyは等価ではない。 |
< | x < y | xはyより小さい(未満)。 |
<= | x <= y | xはy以下である。 |
> | x > y | xはyより大きい。 |
>= | x >= y | xはy以上である。 |
「,」(カンマ)で区切られた式や値は左から順に評価されていきます。このときの「,」(カンマ)が順次演算子です。
・サンプルソース(sample0302.c)
#include <stdio.h> int main() { int x,y; /* 宣言での順次演算子の例 */ for (x=0, y=0; x<3; x++, y++) { /* for制御内での順次演算子の例 */ x = x * 1, y = y * 2; /* 式に対する順次演算子の例 */ printf("x=%d, y=%d\n", x, y); } return 0; }
・実行結果
C:\dev\c>sample0302 [Enter]
x=0, y=0
x=1, y=2
x=2, y=6
条件演算子(三項演算子)は「if~else~」文と同じ処理を1行で記述する事が出来る演算子です。
・サンプルソース(sample0303.c)
#include <stdio.h>
int main() {
int i, x=3, y=5;
for (i=1; i<3; i++) {
x = x*i;
printf("X=%d, Y=%d\n", x, y);
x > y ? printf("XはYより大きい\n") : printf("XはYより小さい\n");
}
return 0;
}
・実行結果
C:\dev\c>sample0303 [Enter]
X=3, Y=5
XはYより小さい
X=6, Y=5
XはYより大きい
優先順位 | 結合方向 | 演算子 | 種類 |
1 | 左から | 「()」,「.」,「->」,「[]」,「++」,「--」 | 関数呼出し,ドット,アロー,添字,後置増分,後置減分 |
2 | 右から | 「++」,「--」,「~」,「!」,「+」,「-」,「&」,「*」,「sizeof」 | 前置増減分,補数,論理否定,単項式 |
3 | 右から | 「(型)」 | キャスト |
4 | 左から | 「*」,「/」,「%」 | 二単項乗算,二単項除算,二単項剰余 |
5 | 左から | 「+」,「-」 | 二単項加算,二単項減算 |
6 | 左から | 「<<」,「>>」 | シフト |
7 | 左から | 「<」,「<=」,「>」,「>=」 | 比較 |
8 | 左から | 「==」,「!=」 | 比較 |
9 | 左から | 「&」 | AND(ビット積) |
10 | 左から | 「^」 | 排他OR(ビット差) |
11 | 左から | 「|」 | OR(ビット和) |
12 | 左から | 「&&」 | AND(論理積) |
13 | 左から | 「||」 | OR(論理和) |
14 | 右から | 「?:」 | 条件 |
15 | 右から | 「=」,「*=」,「/=」,「%=」,「+=」,「-=」,「<<=」,「>>=」,「&=」,「|=」,「^=」 | 代入,複合 |
16 | 左から | 「,」 | カンマ |