プログラム初心者のためのC#入門 #3 演算子

# #3 演算子
例えば`a + b`のような**式**があったとして，+ を**演算子**(オペレーター)，a や b を**被演算子**(オペランド)といいます．
##算術演算子
```OperatorSample.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace OperatorSample
{
    class Program
    {
        static void Main(string[] args)
        {
            int operand1 = 5; 
            int operand2 = 2;

            int a = operand1 + operand2;  // 加算．aは7．
            int b = operand1 - operand2;  // 減算．bは3．
            int c = operand1 * operand2;  // 乗算．cは10．
            int d = operand1 / operand2;  // 除算．dは2．
            int e = operand1 % operand2;  // 除算の剰余．eは1．
        }
    }
}
```
`*`や`%`はちょっと慣れないかもしれませんね．あと，`/`は整数型同士の演算の場合，小数点以下は切り捨てられるというところも注意です．また，`+`は文字列の結合のための演算子としても使えます．例えば，`string str = "Hello, " + "world!"`で`str`は`"Hello, world!"`になります．
今回はint型同士でサンプルコードを書きましたが，double型同士や，int型やdouble型など違う型同士の演算もどうなるかやってみてください．
##インクリメント・デクリメント
```OperatorSample.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace OperatorSample
{
    class Program
    {
        static void Main(string[] args)
        {
            int a = 2;
            int b = a++;  // aは3．bは2．
            a = 2;
            b = a--;      // aは1．bは2．
            a = 2;
            b = ++a;      // aは3．bも3．
            a = 2;
            b = --a;      // aは1．bも1．
        }
    }
}
```
`a++`，`++a`はaに1加算します．これをインクリメントと言います．また，`a--`，`--a`はaから1減算します．これをデクリメントと言います．インクリメント，デクリメントはそれぞれ，前置きと後置きがあり，これによってインクリメント，デクリメントのタイミングが変わります．たとえば，`a++`は後置きなので，演算が終わってからインクリメントされます．反対に，`++a`は前置きなので，インクリメントされてから演算されます．
##論理演算子
```OperatorSample.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace OperatorSample
{
    class Program
    {
        static void Main(string[] args)
        {
            bool a = true & false;  // 論理積．aはfalse．
            bool b = true | false;  // 論理和．bはtrue．
            bool c = true ^ false;  // 排他的論理和．cはtrue．
            bool d = !true;  // 否定．dはfalse．
            int e = ~43;  // 1の補数．eは-44．
        }
    }
}
```
`!`はbool型のみ，`~`は整数型のみ，`&`，`|`，`^`はbool型に加えて整数型にも適用できます．
また，`&&`，`||`と書いてもbool値のAND，ORと同じ意味ですが，短絡論理演算子としてはたらきます．例えば，`false & true`と書くと，`false`と`true`どちらのオペランドも評価して`false`を返しますが，`false && true`と書くと，左のオペランドを評価して`false`なら，右のオペランドの評価はせずに`false`を返します．反対に，左のオペランドを評価して`true`だった場合，右のオペランドの評価を返します．
## シフト演算子
```OperatorSample.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace OperatorSample
{
    class Program
    {
        static void Main(string[] args)
        {
            int a = 45 << 3;  // aは360．
            int b = 45 >> 2;  // bは11．
        }
    }
}
```
45を2進数で表すと101101です．シフト演算子はこれを何ビット分かずらします．`45 << 3`は，3ビット分だけ左にシフトするので101101000，つまり360となり，`45 >> 2`は，2ビット分だけ右にシフトするので1011，つまり11となります．
##代入演算子
```OperatorSample.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace OperatorSample
{
    class Program
    {
        static void Main(string[] args)
        {
            int a = 8;  // aは8．
            a += 5;  // aは13．
            a -= 5;  // aは8．
            a *= 5;  // aは40．
            a /= 5;  // aは8．
            a %= 5;  // aは3．
        }
    }
}
```
まず`=`ですが，これは前も紹介した通り，右の被演算子を左の被演算子に代入するというもので，数学などで右辺と左辺が等しいという意味で使われるイコールではありません．
次に，算術演算子に=が付いたものですが，これは左の被演算子に右の被演算子を演算子で演算した結果を左の被演算子に代入するというものです．はい，わけわかりません．`a += 5`を例に挙げてみましょう．これを簡単な形にすると`a = a + 5`です．aとa + 5が等しいわけないじゃないか！と思う方もまだいるかもしれませんが，=は代入演算子なので等しいという意味は全くありません．aにa + 5の値を代入しているだけです．aを二度書くのが面倒なのでより簡単に書けるようにした感じですね．ちなみに，算術演算子以外にも`&=`，`|=`，`^=`，`<<=`，`>>=`のように`!`と`~`を除く論理演算子やシフト演算子にも適用できます．
##関係演算子
```OperatorSample.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace OperatorSample
{
    class Program
    {
        static void Main(string[] args)
        {
            bool a = (3 == 7);  // aはfalse．
            bool b = (3 != 7);  // bはtrue．
            bool c = (3 < 7);   // cはtrue．
            bool d = (3 > 7);  // dはfalse．
            bool e = (3 <= 7);  // eはtrue．
            bool f = (3 >= 7);  // fはfalse．
        }
    }
}
```
先ほど`=`は等しいことを示す演算子ではないことを説明しましたが，プログラムの世界で二つの値が等しいか判断するための演算子があります．それが`==`です．その反対に，二つの値が等しくないかどうかを判断するためには`!=`が使われます．上の例では3と7は等しくないため，aにはfalse，bにはtrueが代入されます．`<`，`>`，`<=`，`>=`はそれぞれ数学の<，>，≤，≥と同じ感じです．しかし，これらも値の大小を保証する数学のそれと違って，値の大小が記述した通りであるかをbool値で返すものなので注意してください．
また，プログラムの式の中に書く丸括弧は，数学で使うそれと同じように，丸括弧で囲ったところから計算してくださいという意味です．今回のはあってもなくても変わらないんですが，あった方が分かりやすいと思って入れました．

ちなみにあっても無くても変わらないものと言えばスペースですね．厳密には然るべき場所には入れないといけませんし，変なところに入れてしまうとエラーになることもあります．例えば，`intnum=3;`と書くとintnumなんて変数知りません！と怒られちゃいますし，`i n t n u m = 3 ;`なんて書いちゃうとパソコンが勝手にシャットダウンしかねません(大嘘)．しかし「キーワードの中にはスペースを入れない」，「キーワード同士はスペースで区切る」の二点を守ればどこにどれだけスペースを入れてもプログラムは動きます．ただし全角スペースだとエラーになるので気をつけてください．

次回は[条件分岐](https://qiita.com/17t7037t/items/1b826339ccf6e992c01c)について説明します．

##演習問題
float型の定数PI = 3.14と，int型の変数rを定義し，好きな整数で初期化したrを半径として円の面積，円周の長さを画面に出力してください．

<details><summary>解答例</summary><div>
今回はちょっと簡単でしたね．

```OperatorSample.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace OperatorSample
{
    class Program
    {
        static void Main(string[] args)
        {
            const float PI = 3.14f;
            int r = 3;

            Console.WriteLine("面積 : " + PI * r * r);
            Console.WriteLine("円周 : " + 2 * PI * r);
        }
    }
}
```
</div></details>