演算子 | 機能 | 備考 | |||
---|---|---|---|---|---|
+ | 加算 | 足し算 | a + b | a がポインタの時は特別 | |
- | 減算 | 引き算 | a - b | ||
* | 乗算 | 掛け算 | a * b | ||
/ | 除算 | 割り算 | a / b | 整数型同士で被演算数が負の場合の 切り捨て方向は処理系依存 |
a == (a/b)*b + a%b は保証される |
% | 剰余 | 割り算 の余り |
a % b | 整数型同士で被演算数が負の場合の 結果の符合は処理系依存 |
演算のパターン | 結果の値と型 |
---|---|
ポインタ型 + 整数型 | その数だけ後ろ要素を指すポインタ |
ポインタ型 - 整数型 | その数だけ前の要素を指すポインタ |
ポインタ型 - ポインタ型 | ポインタに挟まれた要素数を表す整数 |
演算子 | 機能 | 備考 |
---|---|---|
+ | プラス | +a |
- | マイナス | -a |
演算子 | 機能 | 備考 | |
---|---|---|---|
& | ビット毎の 論理積 |
a & b | ビットマスクに使われる |
| | ビット毎の 論理和 |
a | b | ビットオンに使われる |
^ | ビット毎の 排他的論理和 |
a ^ b | ビット反転に使われる |
<< | 左シフト | a << b | aをbビット左シフト(右から0が入る) 2bを掛けるのと同じ |
>> | 右シフト | a >> b | aをbビット右シフト 符号無し数の場合: 論理シフトで、2bで割るのと同じ 符号付き数の場合: 論理シフト/算術シフトは処理系依存 |
~ | 1の補数 | ~a | aの各ビットの0/1を反転する |
被演算ビット | 論理積(AND) | 論理和(OR) | 排他的論理和(XOR) | 論理否定(NOT) | |
a | b | a & b | a | b | a ^ b | ~a |
0 | 0 | 0 | 0 | 0 | 1 |
0 | 1 | 0 | 1 | 1 | |
1 | 0 | 0 | 1 | 1 | 0 |
1 | 1 | 1 | 1 | 0 |
|
インクリメント・デクリメント演算子
|
演算子 | 機能 | 数学 | 備考 |
---|---|---|---|
> | より大きい | > | 算術演算子よりも優先順位が低く 論理演算子よりも優先順位が高い 結果はint型で、真のとき 1、偽のとき 0 |
>= | 以上 | ≧ | |
< | より小さい | < | |
<= | 以下 | ≦ | |
== ※ | 等しい | = | |
!= | 等しくない | ≠ |
演算子 | 機能 | 備考 | ||
---|---|---|---|---|
&& | 論理積(AND) | 式1 && 式2 | 式1の値が0(偽)のとき 式2を実行せずに、0(偽) 式1の値が0でない(真)のとき 式2を実行して、 その値が0(偽)ならば 0、 0でない(真)ならば 1 | 結果はint型で、 真のとき 1、 偽のとき 0 |
|| | 論理和(OR) | 式1 || 式2 | 式1の値が0でない(真)のとき 式2を実行せずに、1(真) 式1の値が0(偽)のとき 式2を実行して、 その値が0(偽)ならば 0、 0でない(真)ならば 1 | |
! | 論理否定(NOT) | !式1 | 式1が0でない(真)のとき 0 式1が0(偽)のとき 1 |
被演算式 | 論理積(AND) | 論理和(OR) | 論理否定(NOT) | |
式1 | 式2 | 式1 && 式2 | 式1 || 式2 | !式1 |
偽 | 偽 | 偽 | 偽 | 真 |
偽 | 真 | 真 | ||
真 | 偽 | 偽 | 真 | 偽 |
真 | 真 | 真 |
sizeof オブジェクト
sizeof( 型名 )
(型名)式
優先 順位 | 演算子 | 結合 規則 | 備考 |
高 ↑ ↓ 低 |
() [] -> . | → | 関数、配列、構造体 |
! ~ ++ -- + - * & (型) sizeof | ← | 単項 | |
* / % | → | 2項(乗、除、剰余) | |
+ - | → | 2項(加、減) | |
<< >> | → | ビットシフト(左、右) | |
< <= > >= | → | 比較 | |
== != | → | 比較 | |
& | → | ビット毎の論理積 | |
^ | → | ビット毎の排他的論理和 | |
| | → | ビット毎の論理和 | |
&& | → | 論理積 | |
|| | → | 論理和 | |
? : | ← | 条件式(3項) | |
= += -= *= /= %= &= ^= |= <<= >>= | ← | 代入 | |
, | → | コンマ |
数学 | 意味 | Cの式 | 備考 |
---|---|---|---|
x = 1 | x に 1 を代入する | x = 1 | 代入演算子、 == と間違わないこと |
a = b | a と b が等しい | a == b | 関係(比較)演算子、 = = ではダメ、= と間違わないこと |
a ≠ b | a と b が等しくない | a != b | 関係(比較)演算子、 ! = や <> ではダメ、論理否定を使って !(a==b) でも良い |
a ≧ b | a は b 以上 | a >= b | 関係(比較)演算子、 > = ではダメ |
a ≦ b | a は b 以下 | a <= b | 関係(比較)演算子、 < = ではダメ |
a = b = 0 | a 、b に 0 を代入する | a = b = 0 | 代入演算子、 場所によっては a = 0; b = 0; や a = 0, b = 0 でも良い |
a = b = 0 | a も b も 0 に等しい | a == 0 && b == 0 | 関係(比較)演算子と論理演算子、 a == b == 0 はダメ |
1 < x < 3 | x は 1 より大きく、3 より小さい | 1 < x && x < 3 | 関係(比較)演算子と論理演算子、 1 < x < 3 はダメ |
x ≦ 1,3 ≦ x | x は 1 以下または 3 以上 | x <= 1 || 3 <= x | 関係(比較)演算子と論理演算子、 x <= 1, 3 <= x はダメ |
a = 2,b = 4 | a は 2、b は 4 に等しい | a == 2 && b == 4 | 関係(比較)演算子と論理演算子、 a == 2, b == 4 はダメ |
#define NUM 10
int a[NUM], *p;
/* A 配列 a の全ての要素を 0 にする */
for( i = 0; i < NUM; i++ )
a[i] = 0;
/* A’ 配列 a の全ての要素を 0 にする */
for( i = 0; i < NUM; )
a[i++] = 0; /* 後置インクリメント演算子++を用いてこのように記述できる *
/* B 配列 a のそれぞれの要素を 3 ずつ増やす */
for( i = 0; i < NUM; i++ )
a[i] = a[i] + 3;
/* B’ 配列 a のそれぞれの要素を 3 ずつ増やす */
for( i = 0; i < NUM; i++ )
a[i] += 3; /* 代入演算子+=を用いてこのように記述できる */
/* B'' 配列 a のそれぞれの要素を 3 ずつ増やす */
for( i = 0; i < NUM; )
a[i++] += 3; /* 後置インクリメント演算子++を用いてこのように記述できる */
/*
ここで、x op= y を機械的に x = x op y と置き換えてみると、
a[i++] += 3; は、
a[i++] = a[i++] + 3; となるが、
これでは、i の値は 2 増えてしまうし、
所望の結果は得られない!
(実際には置き換え処理が行われているのではないってこと!)
x op= y は、
p = &x; // 値を格納すべき場所(元の x のアドレス)を求めておき
*p = *p op y; // 元の x の値と y の値を演算(op)し、その結果を格納すべき場所に入れる
と実際には動いている
例えば、a[i++] += 3; の場合は、
p = &a[i++];
*p = *p + 3;
*/
このややこしい?演算子(x op= y)の存在意義は、x = x op y という有り勝ちな演算パターンに対して、