分岐1(Rustの基本構文-5-)

#はじめに
Rustの基本的な文法についてまとめてみた。第5回！
今回からはプログラムの構文として、様々なことに使われる「__分岐__」について。
C/C++, python ,java, rubyなどでも多くに使われる。
###目的
Rustにおける基本的な構文の理解をする。

#Rustの基本構文シリーズ
第1回⇒[Rustの基本構文(1)](https://qiita.com/jin237/items/b344d3a7e6dfe1056e31)　　URL：https://qiita.com/jin237/items/b344d3a7e6dfe1056e31
第2回⇒[Rustの基本構文(2)](https://qiita.com/jin237/items/6910b4f803a35f317213)　　URL： https://qiita.com/jin237/items/6910b4f803a35f317213
第3回⇒[Rustの基本構文(3)](https://qiita.com/jin237/items/59ef229a4de30cb8203b)　　URL：https://qiita.com/jin237/items/59ef229a4de30cb8203b
第4回⇒[Rustの基本構文(4)](https://qiita.com/jin237/items/42249f984746711be0e2)　　URL： https://qiita.com/jin237/items/42249f984746711be0e2

#演算子
先に演算子について軽くまとめておく。他の言語における演算記号などとほぼほぼ一緒である。
###四則演算に関して
・"__+__"は加法(足し算)を示す。
・"__-__"は減法(引き算)を示す。
・"__*__"は乗法(掛け算)を示す。
・"__/__"は除法(割り算)を示す。
ここで、計算プログラムで注意が必要である。

```rust
let answer = 70 + 8.9;
println!("70 + 8.9 = {}", answer);
```
という簡単そうな計算でもこのコードだと下記のようなエラーが出てくる。

```terminal
[Running] cd "c:\Users\[username]\rust\project1\" && rustc culc1.rs && "c:\Users\[username]\rust\project1\"culc1
error[E0277]: cannot add a float to an integer
 --> culc1.rs:2:21
  |
2 |     let answer = 70 + 8.9;
  |                     ^ no implementation for `{integer} + {float}`
  |
  = help: the trait `std::ops::Add<{float}>` is not implemented for `{integer}`
error: aborting due to previous error
For more information about this error, try `rustc --explain E0277`.
```
これは浮動小数点数にそろえることによりエラーの解消ができる。

```rust
let answer = 70.0 + 8.9;
println!("70.0 + 8.9 = {}", answer);
```
このコードでしっかりと動く。
これには気を付けたい。

#if式による分岐(基礎構文)
基礎的な構文については、以下のような書き方となる。(ほかの言語と似ている)

例を引用してくる。(from 実践Rust入門　言語仕様から開発手法まで P.230-例1)

###基本となる構文(例1)

```
if 条件式{
     条件がtrueの場合に実行される節(true節)
} else {
     条件がfalseの場合に実行される節(false節)
}
```

```rust
fn main(){
  let a = 11;
  if a %2 == 0{
      println!("{} is an even number", a);
  } else {
      println!("{} is an odd number", a);
  }
}
```
結果が下記

```terminal
11 is an odd number

[Done] exited with code=0 in ____ seconds
```
のように、a=11とおいて数に対して、偶数と奇数の判定ができる。これはどのプログラム言語でも同じように書くことができる。ちなみに、__"even number"が偶数__、__"odd number"が奇数__となる。
他言語だと上のように書く様式が多いが、あくまで、__if 条件式__なので、式で表すこともできる。
書き方を変えると以下のようにもできる。

###例1の書き換え(例2)

```rust
fn main(){
    let a = 11;
    let even_or_odd = if a % 2 == 0{
        "an even"
    } else {
        "an odd"
    };

    println!("{} is {} number", a, even_or_odd);
}
```
このプログラムは、変数aの11(奇数)によってeven_or_odd変数が"an odd"に束縛される。これより、結果は以下のように表示される。

```terminal
11 is an odd number   //result
```
ここで注意が必要なのが、if式には戻り値が存在(今回の場合は__()__となる)し、__true節、false節のどちらも戻り値の型は同様でないといけない__ということ。ちなみに例1での__if式の後に";"がないが__これはミスではなく__戻り値が"()"の場合には特例によって省くことができる__。

###if式でできないこと
例を引用してくる。(from 実践Rust入門　言語仕様から開発手法まで P.232-例3)

```rust
fn main(){
    let a = 13;

    let result = if a % 2 == 0{
        'E'
    } else {
        "AN ODD"
    };
}
```
という処理を行う。これは、
true処理⇒char型
false処理⇒str型
という処理を行っていますが、result変数での型の確定ができない。rustのif式においてこういった使い方はできない。前述に追記して、__戻り値の型も同じでなければならない__。よって下記のようなErrorが起こってしまう。

```terminal
[Running] cd "c:\Users\[username]\rust\project1\" && rustc even_or_odd.rs && "
[Running] cd "c:\Users\[username]\rust\project1\" && rustc if_function.rs && "c:\Users\[username]\rust\project1\"if_function
error[E0308]: if and else have incompatible types
 --> if_function.rs:7:9
  |
4 |       let result = if a % 2 == 0{
  |  __________________-
5 | |         'E'
  | |         --- expected because of this
6 | |     } else {
7 | |         "AN ODD"
  | |         ^^^^^^^^ expected char, found &str
8 | |     };
  | |_____- if and else have incompatible types
  |
  = note: expected type `char`
             found type `&str`
```

###追記
if式において、__true節のみで戻り値が"()"となる場合、false節を省いても、falseの戻り値が"()"となる__。

```rust
let a = 11;
if a % 2 == 0;{
    println!("{} is an odd number", a);
}
```
とも記述することができる。

#さいごに
if式についての記事を書いてみた。多少間違っているところもあるかもしれないので、ぜひ指摘してほしい。ifのほかにも分岐させるものはあるので次回記載する。