インクリメント・デクリメントの書き方のまとめ(Scala、Java、Rust、C言語、C++、Go言語、PHP、Perl、Python、Ruby、JavaScript)

いろんな言語を触っていると、言語の細かい仕様がだんだんごっちゃになってきてしまいますので、メモです。

インクリメント・デクリメントの有無

あり: Java、C言語、C++、Go言語△、PHP、Perl、JavaScript
なし: Scala、Rust、Python、Ruby

Go言語は式を構成する演算子ではなく文(statement)という扱いにすることで、インクリメントの演算子としての問題を回避していて、個人的にはちょうどいい仕様に感じます。

ついでに代入演算子も確認しましたが、こちらはだいたいの言語にあるようです。

# Scala

- インクリメント・デクリメント演算子はない
- 代入演算子はある

```scala
i += 1
i -= 1
```

`i += 1` などは `i = i + 1` などのシンタックスシュガー。

参考

[Assignment Operators - Expressions | Scala 2.13](https://scala-lang.org/files/archive/spec/2.13/06-expressions.html#assignment-operators)

[Scalaでは、なぜインクリメントやデクリメントができないのか？](http://d.hatena.ne.jp/xuwei/20110130/1296360331)

# Java

- インクリメント・デクリメント演算子は前置・後置ともにある
- 式であり値を返す
- 代入演算子もある

```java
++i;
--i;
i++;
i--;
i += 1;
i -= 1;
```

参考

[Prefix Increment Operator ++ - Java Language Specification](https://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.15.1)

# Rust

- インクリメント・デクリメント演算子はない
- 代入演算子はある

```rust
i += 1;
i -= 1;
```

参考

[Compound assignment expressions - Operator expressions - The Rust Reference](https://doc.rust-lang.org/reference/expressions/operator-expr.html#compound-assignment-expressions)

なぜインクリメント演算子がないのか?
[Why doesn't Rust have increment and decrement operators?](https://prev.rust-lang.org/ja-JP/faq.html#why-doesnt-rust-have-increment-and-decrement-operators)


# C言語、C++

- インクリメント・デクリメント演算子は前置・後置ともにある
- 式であり値を返す
- 代入演算子もある

```c
++i;
--i;
i++;
i--;
i += 1;
i -= 1;
```

# Go言語

- C言語でいうインクリメント・デクリメント演算子は後置のみ
- 式ではなく文の扱いなので、式の中には埋め込めない
- 代入演算子もある

```go
i++
i--
i += 1
i -= 1
```

参考

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

`++`や`--`が演算子ではない件
[演算子とステートメント — プログラミング言語 Go | text.Baldanders.info](https://text.baldanders.info/golang/operators-and-statements/)

# PHP

- インクリメント・デクリメント演算子は前置・後置ともにある
- 式であり値を返す
- 代入演算子もある

```php
++$i;
--$i;
$i++;
$i--;
$i += 1;
$i -= 1;
```

参考

[加算子/減算子 | PHP Manual](http://www.php.net/manual/ja/language.operators.increment.php)

# Perl

- インクリメント・デクリメント演算子は前置・後置ともにある
- 式であり値を返す
- 代入演算子もある

```perl
++$i;
--$i;
$i++;
$i--;
$i += 1;
$i -= 1;
```

参考

[インクリメントとデクリメント - perlop - Perl の演算子と優先順位 - perldoc.jp](https://perldoc.jp/docs/perl/perlop.pod#Auto-increment32and32Auto-decrement)

# Python

- インクリメント・デクリメント演算子はない
- 代入演算子はある

```python
i += 1
i -= 1
```

累算代入文というらしい。

参考

[累算代入文 (augmented assignment statement) - 単純文 (simple statement) — Python 3.8.0 ドキュメント](https://docs.python.org/ja/3/reference/simple_stmts.html#augmented-assignment-statements)

# Ruby

- インクリメント・デクリメント演算子はない
- 代入演算子はある

```ruby
i += 1
i -= 1
```

自己代入というらしい。

参考

[演算子式 (Ruby 2.6.0)](https://docs.ruby-lang.org/ja/2.6.0/doc/spec=2foperator.html)

[Ruby にインクリメント演算子のようなものが無い理由 - fugafuga.write](https://blog.tokoyax.com/entry/ruby/increment)

[Rubyのインクリメント速度のバージョンごとの比較 - Qiita](https://qiita.com/luccafort/items/11e3569095e5b5b67f8e)

# JavaScript

- インクリメント・デクリメント演算子は前置・後置ともにある
- 式であり値を返す
- 代入演算子もある

```javascript
++i;
--i;
i++;
i--;
i += 1;
i -= 1;
```

参考

[Update Expressions - ECMAScript® 2019 Language Specification](https://www.ecma-international.org/ecma-262/10.0/index.html#sec-update-expressions)