Elixir入門 03: 演算子の基本
Tags: elixir, webdev, tutorial, programming
Published: 2018-10-02 07:42:37

---
title: Elixir入門 03: 演算子の基本
published: true
description: Elixir公式サイトの許諾を得て「Basic operators」の解説にもとづき、加筆補正を加えてElixirの基本的な演算子についてご説明します。
tags: #elixir, #webdev, #tutorial, #programming
---

本稿はElixir公式サイトの許諾を得て「[Basic operators](https://elixir-lang.org/getting-started/basic-operators.html)」の解説にもとづき、加筆補正を加えてElixirの基本的な演算子についてご説明します。

# 算術演算
四則演算はつぎのとおりです。演算子`/`による除算は結果が整数であっても、浮動小数点数に変わることにご注意ください。

```elixir
iex> 4 + 2
6
iex> 4 - 2
2
iex> 4 * 2
8
iex> 4 / 2
2.0
iex> (1 + 2) / 3 + 4 * 5
21.0
```

整数の割り算で、商の整数部を得るには[`div/2`関数](https://hexdocs.pm/elixir/Kernel.html#div/2)を用います。また、整数の剰余を求めるのは[`rem/2`関数](https://hexdocs.pm/elixir/Kernel.html#rem/2)です。

```elixir
iex> div(10, 2)
5
iex> rem(10, 3)
1
```


# リストの加減算
リストに別のリストの要素を加えるときは演算子[`++/2`](https://hexdocs.pm/elixir/Kernel.html#++/2)、差し引くには[`--/2`](https://hexdocs.pm/elixir/Kernel.html#--/2)を用います。

```elixir
iex> list ++ ["Cherry"]
[3.14, :pie, true, "Apple", "Cherry"]
iex> ["π"] ++ list
["π", 3.14, :pie, true, "Apple"]
iex> list -- [true, false]
[3.14, :pie, "Apple"]
```


# 文字列の演算
文字列をつなぐ演算子は`<>`です。

```elixir
iex> name = "alice"
iex> "hello " <> name
"hello alice"
```

アトムは`#{}`でかこんで文字列補間することにより、文字列に含めることができます。

```elixir
iex> "hello #{:world}"
"hello world"
```


# 論理和と論理積および否定
論理和`||`と論理積`&&`の演算子は、左オペランド(被演算子)を論理値として評価します。Elixirでは`false`と`nil`を除く値は`true`と評価されます。それぞれの演算子が返す値はつぎのふたつの表001と002のとおりです。

#### 表001■論理和||演算子
| 左オペランドの評価 | 返される値 |
|:---------------:|:--------:|
| `true` | 左オペランドの値 |
| `false` | 右オペランドの値 |


#### 表002■論理和&&演算子
| 左オペランドの評価 | 返される値 |
|:---------------:|:--------:|
| `true` | 右オペランドの値 |
| `false` | 左オペランドの値 |

```elixir
iex> -1 || true
-1
iex> false || 2
2
iex> nil && 3
nil
iex> true && 4
4
```

否定の演算子`!`は、オペランドを論理値として評価したうえで、反転した論理値が返されます。

```elixir
iex> !true
false
iex> !1
false
iex> !nil
true
```

さらに、厳密な論理演算子`or`と`and`および`not`があります。いずれも、はじめのオペランドは必ず論理値でなければなりません。

```elixir
iex> is_atom(:example) and 1
1
iex> false or 1
1
iex> not is_number(false)
true
iex> 1 and true
** (BadBooleanError) expected a boolean on left-side of "and", got: 1
iex> not 1
** (ArgumentError) argument error
    :erlang.not(1)
```

論理和および論理積演算子が左オペランドを返す場合、右オペランドは実行されません。たとえば、実行されれば引数をエラーとして出力する[`raise/1`関数](https://hexdocs.pm/elixir/1.0.5/Kernel.html#raise/1)が右オペランドに置かれたつぎのコードはエラーになりません。

```elixir
iex> false and raise("実行されればエラー")
false
iex> true || raise("実行されればエラー")
true
```


# 比較
値の大小や等しいか等しくないかの比較をする演算子はつぎのとおりです。

- `==`: 等しい
- `!=`: 等しくない
- `<=`: 以下
- `>=`: 以上
- `<`: 小さい
- `>`: 大きい

```elixir
iex> 1 > 2
false
iex> 1 != 2
true
iex> 1 == 1
true
iex> 1 <= 2
true
```

さらに、厳密な等価`===`と不等価`!==`の演算子があります。

```elixir
iex> 1 == 1.0
true
iex> 1 === 1.0
false
```

Elixirでは、異なった型のデータでも大小が比べられます。データのソートを考えたとき、型を心配しなくて済むためです。

```elixir
iex> :hello > 999
true
iex> {:hello, :world} > [1, 2, 3]
false
```

データ型による大きさの順序はつぎのとおりです(「[Term ordering](https://hexdocs.pm/elixir/operators.html#term-ordering)」参照)。

```
number < atom < reference < function < port < pid < tuple < map < list < bitstring
```

#### Elixir入門もくじ
- [Elixir入門 01: コードを書いて試してみる](https://dev.to/gumi/elixir-01--2585)
- [Elixir入門 02: 型の基本](https://dev.to/gumi/elixir-02--30n1)
- Elixir入門 03: 演算子の基本
- [Elixir入門 04: パターンマッチング](https://dev.to/gumi/elixir-04--1346)
- [Elixir入門 05: 条件 - case/cond/if](https://dev.to/gumi/elixir-05----casecondif-60o)
- [Elixir入門 06: バイナリと文字列および文字リスト](https://dev.to/gumi/elixir-06--35na)
- [Elixir入門 07: キーワードリストとマップ](https://dev.to/gumi/elixir-07--39hi)
- [Elixir入門 08: モジュールと関数](https://dev.to/gumi/elixir-08--1c4c)
- [Elixir入門 09: 再帰](https://dev.to/gumi/elixir-09--1a0p)
- [Elixir入門 10: EnumとStream](https://dev.to/gumi/elixir-10-enumstream-4fpb)
- [Elixir入門 11: プロセス](https://dev.to/gumi/elixir-11--2mia)
- [Elixir入門 12: 入出力とファイルシステム](https://dev.to/gumi/elixir-12--4og6)
- [Elixir入門 13: aliasとrequireおよびimport](https://dev.to/gumi/elixir-13-aliasrequireimport-55c1)
- [Elixir入門 14: モジュールの属性](https://dev.to/gumi/elixir-14--3511)
- [Elixir入門 15: 構造体](https://dev.to/gumi/elixir-15--4f43)
- [Elixir入門 16: プロトコル](https://dev.to/gumi/elixir-16--lif)
- [Elixir入門 17: 内包表記](https://dev.to/gumi/elixir-17--5gci)
- [Elixir入門 18: シギル](https://dev.to/gumi/elixir-18--5791)
- [Elixir入門 19: tryとcatchおよびrescue](https://dev.to/gumi/elixir-19-trycatchrescue-50i8)
- [Elixir入門 20: 型の仕様とビヘイビア](https://dev.to/gumi/elixir-20--j50)
- [Elixir入門 21: デバッグ](https://dev.to/gumi/elixir-21--21a1)
- [Elixir入門 22: Erlangライブラリ](https://dev.to/gumi/elixir-22-erlang-2492)
- [Elixir入門 23: つぎのステップ](https://dev.to/gumi/elixir-23--50ik)

##### 番外
- [Elixir入門: Plugを使うには](https://dev.to/gumi/elixir-plug-40lb)