水瓶座列車

どこまで行けるか、とりあえず発車します。

C言語の演算子と優先順位の解説

f:id:aquarius999:20190407000620p:plain

 

四則演算についてはC言語でなくても、算数と同じなのでわかると思いますが、

プログラムでのビット演算や論理演算などは2進数の勉強をしていないとわかりにくいと思います。

今ここで完全に理解できなくても、「こういうものがあるのか。。」ぐらいでも大丈夫です。

実際の仕事や勉強で出てきたときに、集中して理解に努めれば良いと思います。

それでは、C言語演算子と優先順位について解説していきます。

 

 

 

 

1.演算子の種類

 

演算子の種類としては、

1.1. 算術演算子

1.2. インクリメント演算子

1.3. 比較演算子

1.4. 論理演算子

1.5. ビット演算子

1.6. 代入演算子

1.7. 条項演算子

があります。

 

各々について説明していきます。

 

 

1.1. 算術演算子

 

算術演算子は、足し算、引き算、掛け算、割り算の演算子で、

使用例など下表になります。

 

演算子 説明 使用例 使用例説明
加算 a = b + c bとcを足し算した値をaに入れる。
減算 a = b - c bからcを引き算した値をaに入れる。
乗算 a = b * c bとcを掛け算した値をaに入れる。
徐算 a = b / c bをcで割り算した値をaに入れる。
余り a = b % c bをcで割り算した余りをaに入れる。

 

 これらの演算子を使わないソフトウェアはおそらくありません。 それぐらい使います。

 

 

1.2. インクリメント演算子

 

インクリメントやデクリメントは、変数に1足したり、1引いたりしますが、

演算子を変数の後ろにつけるか前につけるかで動きが変わります。

使用例などを下表にまとめました。

 

演算子 説明 使用例 使用例説明
++ インクリメント

a = b++;

a = ++b;

bをaに入れた後に、bをインクリメントする。

bをインクリメントして、aに入れる。

-- デクリメント

a = b--;

a = --b;

bをaに入れた後に、bをデクリメントする。

bをデクリメントして、aに入れる。

 

while文やfor文でのループの回数を数えるときに良く使用しますが、

ループ条件で、前に付けるか後ろに付けるか、やりやすい方を使用すると良いです。

 

 

1.3. 比較演算子

 

比較演算子は、条件分岐構文の if/else文でよく使用します。

 

演算子 説明 使用例 使用例説明

<

>

大小比較

(比較対象の値は含まない)

a < 8

a > 8

aが7以下なら真、8以上なら偽。

aが9以上なら真、8以下なら偽。

<=

>=

大小比較

(比較対象の値は含む)

a <= 8

a >= 8

aが8以下なら真、9以上なら偽。

aが8以上なら真、7以下なら偽。

== 等値比較 a == 8

aが8なら真、8以外なら偽。

!= 不等値比較 a != 8 aが8以外なら真、8なら偽。

 

 

1.4. 論理演算子

 

論理演算子も、条件分岐構文の if/else文でよく使用します。

 

演算子 説明 使用例 使用例説明
&& 論理積 5 <= a && a <= 10 aが5以上かつ10以下なら真、それ以外は偽。
|| 論理和 b <= 5 || b >= 10 bが5以下もしくは10以上なら真、それ以外は偽。

 

 

1.5. ビット演算子

 

ビットシフトの演算子は、デバイスドライバで使用することが多いです。

他は、数値計算や数学系のプログラムなどでよく使用されています。

 

演算子 説明 使用例 使用例説明
& ビット毎の論理積(AND) a = b & 0xf0 bと0xf0とのANDの結果をaに入れる。
| ビット毎の論理和(OR) a = b | 0xf0 bと0xf0とのORの結果をaに入れる。
^ ビット毎の排他的論理和(XOR) a = b ^ c bとcとのXORの結果をaに入れる。
~ ビット毎の反転(NOT) a = ~b bのNOTの結果をaに入れる。
<< 左シフト a = b << 8 bを左に8ビットシフトした値をaに入れる。
>> 右シフト a = b >> 8 bを右に8ビットシフトした値をaに入れる。

 

 

1.6. 代入演算子

 

演算子  説明 使用例 使用例説明
= 右辺を左辺に代入。 a = b bの値をaに入れる。
+= 右辺と左辺を足して左辺に入れる。 a += b bとaを足し算した結果をaに入れる。
ー= 右辺と左辺を引いて左辺に入れる。 a -= b bとaを引き算した結果をaに入れる。
*= 右辺と左辺を掛けて左辺に入れる。  a *= b bとaを掛け算した結果をaに入れる。
/= 右辺を左辺で割って左辺に入れる。  a /= b bをaで割り算した結果をaに入れる。
%= 右辺と左辺を割った余りを左辺に入れる。 a %= b bをaで割り算した余りをaに入れる。
&= 右辺と左辺とのANDの結果を左辺に入れる。 a &= 0xf0 aと0xf0とのANDの結果をaに入れる。
|= 右辺と左辺とのORの結果を左辺に入れる。 a |= 0xf0 aと0xf0とのORの結果をaに入れる。
^= 右辺と左辺とのXORの結果を左辺に入れる。 a ^= b bとaとのXORの結果をaに入れる。
<<= 左辺を左辺値分、左シフトして左辺に入れる。 a <<= 8 aを左に8ビットシフトした結果をaに入れる。
>>= 左辺を左辺値分、右シフトして左辺に入れる。 a >>= 8 aを右に8ビットシフトした結果をaに入れる。

 

これらの代入演算子は、直感的にわかりにくい感じがしますので、

例えば、「a = a + b」のような感じで、 まとめずに書くほうが、

他人がプログラムを読んだときにも、わかりやすいと思います。

 

 

1.7. 条項演算子

 

演算子 説明 使用例 使用例説明
?: 加算 a ? b : c aが真ならb、aが偽ならc。

 

私は、今まで数多くのプログラムを見てきましたが、

条項演算子を使用したプログラムは、ほとんど見たことがありません。

この演算子はあまり使用せず、普通にif文で書く方が良いと思います。

 

 

2.演算子の優先順位

 

これまで説明した演算子には同時に使用された場合、

どちらを先に計算するかという優先順位があります。

 

その優先順位の順番は下表のとおりです。

 

優先順位 演算子
優先度高 ()  []  ->  .
 ⇡ !  ~  ++  --  (type)  & 
  | *  /  %
  | +  -
  | <<  >>
  | <  <=  =>  >
  | ==  !=
  | &
  | ^
  | |
  | &&
  | ||
  | ?  :
 ⇣ =  +=  -=  *=  %=  &=  |=  ^=  <<=  >>=
優先度低 ,

 

 

3.最後に

 

演算子は、プログラムを組んだり読んだりしていると、 いつのまにか覚えます。

なので、プログラムをひたすら読み書きをして慣れていきましょう。

 

 

<関連・おすすめ記事> 

私がviエディタを好きになった理由とその使い方 - 水瓶座列車

C言語の始め方と基本構造、コンパイルから実行までを解説 - 水瓶座列車

C言語のデータ型と変数、関数について解説 - 水瓶座列車

C言語の繰り返し構文( while, do while, for )の解説と応用 - 水瓶座列車

プログラミングを独学で勉強するためのLinuxパソコン準備手順 - 水瓶座列車