Developer

【初心者Unity】基本的なC#演算子のまとめ その1(算術・等値・比較・論理)
2022.01.27
Lv1

【初心者Unity】基本的なC#演算子のまとめ その1(算術・等値・比較・論理)

1.はじめに

本記事では、C#における演算子について解説していきます。
演算子全てを取り上げると長大になってしまうので、代表的なものだけピックアップしていきます。

➡【初心者Unity】基本的なC#演算子のまとめ その1(算術・等値・比較・論理)
【初心者Unity】基本的なC#演算子のまとめ その2(ビット・代入・三項・優先順位・結合規則)

2.演算子とは

演算子は、その名の通り、演算をするための記号のことです。
ここでいう演算とは、例えば四則演算のようなものを指します。
また、演算の対象となる値のことをオペランドといいます。

オペランドと演算子の組み合わせをといいます。
また、式が表す値を得ることを評価と呼びます。

3.算術演算子

算術演算子は、四則演算を行うための演算子です。

演算子 名称 使用例 説明
+ 加算演算子 x + y xとyを足し合わせます
減算演算子 x – y xからyを引きます
* 乗算演算子 x * y xとyを掛け合わせます
/ 除算演算子 x / y xをyで割ります
% 剰余演算子 x % y xをyで割った余りを求めます
+ 単項プラス演算子 +x xを表します
単項マイナス演算子 -x xの符号を反転します
++ 前置インクリメント演算子 ++x xに1を足した後に式を評価します
++ 後置インクリメント演算子 x++ 式を評価した後に1を足します
–– 前置デクリメント演算子 ––x xから1引いた後に式を評価します
–– 後置デクリメント演算子 x–– 式を評価した後に1を引きます

インクリメント及びデクリメントについて、具体例を挙げて解説します。

前置インクリメント

int preInc = 1;
Debug.Log(++preInc); // 2 と表示
Debug.Log(preInc); // 2 と表示

2行目で前置インクリメントが行われています。
Debug.Log()は()内の式を評価した後にコンソール出力する関数ですが、前置インクリメントでは評価前に加算が行われるため、加算後の「2」が評価の結果として得られます。
また、3行目の結果を見てわかる通り、前置インクリメントによる加算は元の変数に反映されます。
すなわち、前置インクリメントを分解すると以下のような処理になります。

Debug.Log(++preInc);

↓ 分解すると

preInc = preInc + 1; // 加算を先に実行(元の値に1加算した値を再代入)
Debug.Log(preInc); // 評価値を出力

後置インクリメント

int postInc = 1;
Debug.Log(postInc++); // 1 と表示
Debug.Log(postInc); // 2 と表示

2行目で後置インクリメントが行われています。
後置インクリメントでは評価後に加算が行われるため、加算前の「1」が評価の結果として得られます。
3行目は、前置インクリメントと同様で、元の変数に加算が反映されています。
後置インクリメントを分解すると以下のような処理になります。

Debug.Log(postInc++);

↓ 分解すると

Debug.Log(postInc); // 評価値を出力
postInc = postInc + 1; // 加算を後に実行(元の値に1加算した値を再代入)

デクリメントについては割愛します。
前置後置の違いはインクリメントと同様で、加算ではなく減算が行われます。

4.等値演算子・比較演算子

等値演算子は、左右のオペランドが等しいかどうかを判定する演算子です。
比較演算子は、左右のオペランドの大小を比較する演算子です。
それぞれ、bool値として評価した結果が得られます。

演算子 名称 使用例 説明
== 等値演算子 x == y xとyが等しい場合にtrueになります
!= 非等値演算子 x != y xとyが等しくない場合にtrueになります
> 大なり演算子 x > y xがyよりも大きい場合にtrueになります
>= 以上演算子 x >= y xがy以上の場合にtrueになります
< 小なり演算子 x < y xがyよりも小さい場合にtrueになります
<= 以下演算子 x <= y xがy以下の場合にtrueになります

5.論理演算子

論理演算子は、論理演算(論理積・論理和etc…)を行うための演算子です。
bool型のオペランドに対して使用できます。

演算子 名称 使用例 説明
! 論理否定演算子 !x xの論理否定を求めます
& 論理AND演算子 x & y xとyの論理積を求めます
| 論理OR演算子 x | y xとyの論理和を求めます
&& 条件付き論理AND演算子 x && y xとyの論理積を求めます
xがfalseの場合、yは評価されません
|| 条件付き論理OR演算子 x || y xとyの論理和を求めます
xがtrueの場合、yは評価されません
^ 論理排他的OR演算子 x ^ y xとyの排他的論理和を求めます
左オペランド / 右オペランド & && | || ^
true / true true true true true false
true / false false false true true true
false / true false false true true true
false / false false false false false false

論理AND演算子と条件付き論理AND演算子、及び論理OR演算子と条件付き論理OR演算子の違いについて解説します。

論理AND演算子と条件付き論理AND演算子
論理AND演算子と条件付き論理AND演算子は左オペランドがfalseだった場合の動作が異なります。

AND演算では、左オペランドがfalseだった場合、右オペランドがtrue/falseどちらであっても、評価の結果はfalseになります。
すなわち、右オペランドを評価する必要が無いのです。
条件付き論理AND演算子では、無駄な処理はしない、ということで右オペランドの評価を行わない挙動になります。

具体的なソースコードで確認してみましょう。

int num = 1;
Debug.Log(false & ++num > 1); // false と表示 論理AND演算子
Debug.Log(num); // 2 と表示
Debug.Log(false && ++num > 1); // false と表示 条件付き論理AND演算子
Debug.Log(num); // 2 と表示

2行目で論理AND演算子を使用しています。
右オペランドの++numは実行され、3行目に反映されています(numに1加算されています)。
一方、4行目の条件付き論理AND演算子では、右オペランドの++numが実行されません。
そのため、5行目のnumの出力結果は加算されたものになっていません。

論理OR演算子と条件付き論理OR演算子
論理OR演算子と条件付き論理OR演算子は左オペランドがtrueだった場合の動作が異なります。

OR演算では、左オペランドがtrueだった場合、右オペランドがtrue/falseどちらであっても、評価の結果はtrueになります。
すなわち、右オペランドを評価する必要が無いのです。
条件付き論理OR演算子では、無駄な処理はしない、ということで右オペランドの評価を行わない挙動になります。

具体的なソースコードで確認してみましょう。

int num = 1;
Debug.Log(true | ++num > 1); // true と表示
Debug.Log(num); // 2 と表示
Debug.Log(true || ++num > 1); // true と表示
Debug.Log(num); // 2 と表示

2行目で論理OR演算子を使用しています。
右オペランドの++numは実行され、3行目に反映されています(numに1加算されています)。
一方、4行目の条件付き論理OR演算子では、右オペランドの++numが実行されません。
そのため、5行目のnumの出力結果は加算されたものになっていません。

続きます➡【初心者Unity】基本的なC#演算子のまとめ その2(ビット・代入・三項・優先順位・結合規則)

 

連載目次リンク

「初心者のための」Unityゲーム制作 目次
 

Unity実践編 - 目次リンク

実践Unityゲームプログラミング 連載目次