C言語ホーム > 演算子前ページ次ページ
サイト内検索:

C言語の演算子について

C言語の算術演算子、論理演算子、条件演算子、比較演算子、ビット演算子、べき乗の演算子、余りの演算子、などについて説明しています。優先順位一覧もあります。

算術演算子

算術演算子には以下のものがあります。

<算術演算子と意味>
演算子種別意味
+加算x + yxyを加える。
-減算x - yxからyを引く。
*乗算x * yxyをかける。
/除算x / yxyで割る。
%剰余算x % yxyで割った余りを求める。


整数の割り算では、小数点以下は切り捨てられます。被演算数が負の時の切り捨ての方向は機種に依存します。

+と-は同じ優先順位です。* / %も同じ優先度で、こちらのグループの方が+と-よりも優先順位が高くなります。

<C言語で「余り」を求める演算子%>

C言語で「余り」を求める演算子は%です。x % yはxをyで割った余りになります。この余りを求める演算子はfloatやdoubleに対しては使えません。被演算数が負の時の余りの符号は機種依存となります。

浮動小数点数に対して、余りを求めたい場合はfmod標準ライブラリ関数を使用します。文法は以下のとおりで、この関数はx/yの余りを返します。


#include <math.h>
double fmod(double x, double y);

論理演算子

C言語の論理演算子には以下のものがあります。

<論理演算子と意味>
演算子種別意味
&&論理積(AND)a && babが共に真の場合「真」
||論理和(OR)a || baまたはbが真の場合「真」
!否定(NOT)!aaが偽の場合「真」、aが真の場合「偽」

論理演算子を使う上で注意すべき点があります。それは、&&と||を使った場合、左側から式が評価され、その評価は全体の真、偽が決定した時点で終わる、ということです。これは、左側の式の真偽が、右側の式の実行条件になっている、ことを意味しますし、また、左側の式の真偽によって、右側の式が実行されないこともある、ということも意味します。

具体例を見てみましょう。

<論理演算子の注意点のサンプルソース>

#include <stdio.h>

int main(int argc, char *argv[])
{
	int i=0, j=0;

	if (i && (j=j+1)) {
		;
	}
	printf("%d,%d¥n",i,j);
	return 0;
}

このプログラムをコンパイル、実行すると、下記のように表示されます。

0,0

iとjは0で初期化されています。if (i && (j=j+1)) {を評価するとき、iが0ですので、この時点で(i && (j=j+1))が偽と決定しj=j+1は実行されません。そのため、iとjが共に初期値の0のままで出力されます。

iの初期値を1と変えるとプログラムの実行結果は1,1となります。if (i && (j=j+1)) {を評価するとき、iが真ですので、この時点では(i && (j=j+1))の真偽が決定しません。そのためj=j+1が実行、評価され、jが1となります。

この仕様は、うっかり忘れてしまいがちですので注意しましょう。

条件演算子

条件演算子(じょうけんえんざんし、conditional operator)とは、条件によって異なる値を返す演算子のことです。被演算子が3つある3項演算子のひとつです。

<条件演算子と意味>
演算子種別意味
? :条件演算子a ? b : caが真ならbが実行、aが偽ならcが実行。

例を見てみましょう。


cnt = (cnt < 100) ? cnt + 1 : 0;

この例ではcntが100未満なら1カウントアップされ、100以上ならcntが0となります。つまり、以下のif文と同じとなります。


if (cnt < 100) {
	cnt = cnt + 1;
} else {
	cnt = 0;
}

比較演算子

比較演算子は、関係演算子とも呼ばれ、C言語には下記のものがあります。

<比較演算子と意味>
演算子一般的な読み意味
<小なりa < babより小さい
<=小なりイコールa <= bab以下
>大なりa > babより大きい
>=大なりイコールa >= bab以上
==イコールa == babは等しい
!=ノットイコールa != babは異なる

比較の「==」と代入の「=」をうっかり間違えるケースがよくあります。気をつけましょう。また、ノットイコールは「<>」ではなく「!=」です。

ビット演算子

ビット演算子はビット単位でデータを操作する演算子です。操作できる型は整数(char含む)のみです。

<ビット演算子と意味>
演算子種別意味
&ビット毎のANDa & babのビット単位のAND
|ビット毎のORa | babのビット単位のOR
^ビット毎の排他的ORa ^ babのビット単位の排他的OR
<<左シフトa << babビット分、左へシフト
>>右シフトa >> babビット分、右へシフト
~ビット単位の反転~aaの各ビットを反転

ビット毎のAND演算子&は、指定のビットをマスクするためによく使われます。例えば、x = x & 0x0Fとするとxの下位4ビット以外は0になります。

ビット毎のOR演算子|は、指定のビットをオンにするためによく使われます。例えば、x = x | 0x02とするとxの下位2ビット目が1になります。

ビット毎の排他的OR演算子^は、2つの数の対応するビットが異なる時にそのビットが1になり、同じ時にそのビットが0になります。例えば、x = 0xE7 ^ 0x7Eならxは0x99になります。

シフト演算子<<と>>は左側の被演算数を右側の被演算数のビット数分シフトさせる演算子です。例えばx << 1ならxを左へ1ビットシフトします。空になるビット、今の場合は右から1ビット目、には0が入ります。unsignedの数の右シフトでは左から0が入ります。signedの数の右シフトでは、計算機によって、左から符号桁が入ってくる場合(算術シフト)と0が入ってくる場合(論理シフト)があります。

単項演算子~を使うとビットの反転が行えます。ビット単位で1が0に、0が1になります。~はチルダと読みます。~をニョロと呼ぶ人もいます。

べき乗の演算子

C言語にはべき乗(累乗)の演算子はありません。べき乗を計算するときは標準ライブラリ関数のpow()を使用します。文法は以下のとおりです。xのy乗を返します。


#include <math.h>
double pow(double x, double y);

べき乗(累乗)の演算子は^でも**でもありません。うっかり間違えないように気をつけましょう。特に^の場合、コンパイルエラーとはなりませんので注意が必要です。

演算子の優先順位一覧

1つの式の中に複数の演算子が現れた場合には、各演算子の優先順位と結合規則によって演算の順番が決まります。演算子の優先順位と結合規則をまとめた表が下記の表です。

<C言語の全演算子の優先順位>
優先順位演算子用法名称結合規則
1[]a[b]添字演算子左から右
()a(b)関数呼出し演算子左から右
.a.bドット演算子左から右
->a->bポインタ演算子左から右
++a++後置増分演算子左から右
--a--後置減分演算子左から右
2++++a前置増分演算子右から左
----a前置減分演算子右から左
&&a単項&演算子、アドレス演算子右から左
**a単項*演算子、間接演算子右から左
++a単項+演算子右から左
--a単項-演算子右から左
~~a補数演算子右から左
!!a論理否定演算子右から左
sizeofsizeof asizeof演算子右から左
3()(a)bキャスト演算子右から左
4*a * b2項*演算子、乗算演算子左から右
/a / b除算演算子左から右
%a % b剰余演算子左から右
5+a + b2項+演算子、加算演算子左から右
-a - b2項-演算子、減算演算子左から右
6<<a << b左シフト演算子左から右
>>a >> b右シフト演算子左から右
7<a < b<演算子左から右
<=a <= b<=演算子左から右
>a > b>演算子左から右
>=a >= b>=演算子左から右
8==a == b等価演算子左から右
!=a != b非等価演算子左から右
9&a & bビット単位のAND演算子左から右
10^a ^ bビット単位の排他OR演算子左から右
11|a | bビット単位のOR演算子左から右
12&&a && b論理AND演算子左から右
13||a || b論理OR演算子左から右
14? :a ? b : c条件演算子右から左
15=a = b単純代入演算子右から左
+=a += b加算代入演算子右から左
-=a -= b減算代入演算子右から左
*=a *= b乗算代入演算子右から左
/=a /= b除算代入演算子右から左
%=a %= b剰余代入演算子右から左
<<=a <<= b左シフト代入演算子右から左
>>=a >>= b右シフト代入演算子右から左
&=a &= bビット単位のAND代入演算子右から左
^=a ^= bビット単位の排他OR代入演算子右から左
|=a |= bビット単位のOR代入演算子右から左
16,a , bコンマ演算子左から右

1つの式の中に複数の演算子が現れた場合、優先順位の高いものから評価されます。優先順位が同じであった場合には、結合規則の方向に演算が行われます。例えば、a + b * cの場合は、*の優先順位が高いので、a + (b * c)と解釈されます。a + b - cの場合は、+と-は優先順位が同じですので、結合規則にしたがって(a + b) - cと解釈されます。

優先順位は、1つの式の中に複数の演算子が現れた場合に、どの演算子から評価するかを示すものであり、結合規則は優先順位が同じであった場合、左右どちらの演算子と結合して、先に評価するのかを示すものです。

C言語ホーム > 演算子前ページ次ページ
© 2009-2011 C言語サイト管理人