if文の書き方のまとめ(Scala、Java、Rust、C言語、C++、Go言語、PHP、Perl、Python、Ruby)

いろんな言語を触っていると、言語の重要な特徴はともかく、細かい文法や記号の使い方などがだんだんごっちゃになってきてしまいます。あれ、これってこの言語だとどう書くんだっけ？ってなることがよくあります。前はよく使っていた言語なのに、ちょっと離れただけでもう忘れてしまった、とショックに感じることもあります。なので、こういうメモを作っていこうと思います。

# Scala

```scala
if (x >= 30) {
    ...
} else if (x >= 0) {
    ...
} else {
    ...
}

// 文ではなく式
val max = if (a > b) a else b
```

- 条件式は論理値であることが必要
- C言語と同様に`{ }`の中の式が1つの場合は`{ }`を省略可能 ([dangling else問題](https://www.google.com/search?q=dangling+else)あり)
- 文ではなく式

※厳密には、上記例での`{ ... }`の箇所は式を1つ置けるのであって、中かっこはif式の仕様ではなくブロック式の構文の一部です。ブロック式以外の式を置けば、C言語でいう中かっこが省略されたのと同じ見た目になります。

[Conditional Expressions - Expressions | Scala 2.13](https://scala-lang.org/files/archive/spec/2.13/06-expressions.html#conditional-expressions)

# Java

```java
if (x >= 30) {
    ...;
} else if (x >= 0) {
    ...;
} else {
    ...;
}
```

- 条件式は論理値であることが必要
- C言語と同様に`{ }`の中の文が1つの場合は`{ }`を省略可能 ([dangling else問題](https://www.google.com/search?q=dangling+else)あり)

[The if Statement - Java Language Specification](http://docs.oracle.com/javase/specs/jls/se8/html/jls-14.html#jls-14.9)

# Rust

```rust
if x >= 30 {
    ...
} else if x >= 0 {
    ...
} else {
    ...
}

// 文ではなく式
let max = if a > b { a } else { b };
```

- 条件式は論理値であることが必要
- C言語と違って`{ }`は省略できない
- 文ではなく式

[if Expressions - Control Flow - The Rust Programming Language](https://doc.rust-lang.org/1.30.0/book/2018-edition/ch03-05-control-flow.html#if-expressions)

# C言語、C++

```c
if (x >= 30) {
    ...;
} else if (x >= 0) {
    ...;
} else {
    ...;
}

// { } の中の文が1つの場合は { } を省略可
if (x >= 30)
    ...;
else if (x >= 0)
    ...;
else
    ...;
```

- 条件式は型によって適切に真か偽に解釈される
- `{ }`の中の文が1つの場合は`{ }`を省略可能 ([dangling else問題](https://www.google.com/search?q=dangling+else)あり)

# Go言語

```go
if x >= 30 {
    ...
} else if x >= 0 {
    ...
} else {
    ...
}

// こういうのも可能
if x := f(); x >= 0 {
    ...
}
```

- 条件式は論理値であることが必要
- C言語と違って`{ }`は省略できない

[If statements - The Go Programming Language Specification - The Go Programming Language](https://golang.org/ref/spec#If_statements)

# PHP

```php
if ($x >= 30) {
    ...;
} else if ($x >= 0) {
    ...;
} elseif ($x >= 0) { // else if でも elseif でもOK
    ...;
} else {
    ...;
}

// 別の構文
if ($x >= 30):
    ...;
elseif ($x >= 0): // else if は不可
    ...;
else:
    ...;
endif;
```

- 条件式は型によって適切に真か偽に解釈される
- 1つ目の構文ではC言語と同様に`{ }`の中の文が1つの場合は`{ }`を省略可能 ([dangling else問題](https://www.google.com/search?q=dangling+else)あり)

[PHP: if - Manual](https://www.php.net/manual/ja/control-structures.if.php)
[PHP: 制御構造に関する別の構文 - Manual](https://www.php.net/manual/ja/control-structures.alternative-syntax.php)

# Perl

```perl
if ($x >= 30) {
    ...;
} elsif ($x >= 0) {
    ...;
} else {
    ...;
}

# 反対
unless ($x >= 0) {
    ...;
}

# 文修飾子(後置のif構文)
... if $x >= 0;
... unless $x >= 0;
```

- 条件式は型によって適切に真か偽に解釈される
- C言語と違って`{ }`は省略できない

[複合文 - perlsyn - Perl の文法 - perldoc.jp](https://perldoc.jp/docs/perl/5.26.1/perlsyn.pod#Compound32Statements)
[文修飾子 - perlsyn - Perl の文法 - perldoc.jp](https://perldoc.jp/docs/perl/5.22.1/perlsyn.pod#Statement32Modifiers)

# Python

```python
if x >= 30:
    ...
elif x >= 0:
    ...
else:
    ...
```

- 条件式は型によって適切に真か偽に解釈される
- インデント！

[if Statements - More Control Flow Tools — Python 3.8.0 documentation](https://docs.python.org/3/tutorial/controlflow.html#if-statements)

# Ruby

```ruby

if x >= 30
  ...
elsif x >= 0
  ...
else
  ...
end

# 反対
unless x >= 0
  ...
end

# 文ではなく式
max = if a > b then a else b end

# if修飾子(後置のif構文)
... if x >= 0
... unless x >= 0
```

- 条件式は型によって適切に真か偽に解釈される
- 文ではなく式
- `if`と`elsif`の最後は`then`を書くが改行が続く場合は省略可

[条件分岐 - 制御構造 (Ruby 2.6.0)](https://docs.ruby-lang.org/ja/2.6.0/doc/spec=2fcontrol.html#if)