を受けて。そもそも ++
要るのか?というお話です。
Rustに限らずモダン言語だと ++
を許さないやつ結構多いです。Pythonとか。
Rust
fn main() {
let mut i = 0;
// コンパイルエラー
// i++;
// ++i;
// こう書かなければならない
i += 1;
println!("{}", i);
// i += 1 の返り値は () なので以下もコンパイルエラー。
// println!("{}", (i += 1));
// 以下はOK (++i相当)
println!("{}", {
i += 1;
i
});
// 少し回りくどい (i++相当)
println!(
"{}, {}",
{
let res = i;
i += 1;
res
},
i
);
}
そもそもRustは mut
をつけてものを書くということ自体避けるので上のようなコードを書くことはほぼありえないでしょう。(つまりタイトルでRustの名前をお借りしたということですごめんなさい)
以下に示すようなC言語コードの未規定動作(要出典)の存在が原因でなくなったのだと思います。僕自身がよくやらかすので残しておきます。
c
#include <stdio.h>
void func(int a, int b, int c) {
printf("a = %d, b = %d, c = %d\n", a, b, c);
}
int main() {
int i = 0;
// 0, 1, 1 を期待
func(i, ++i, i++);
return 0;
}
実際の出力は環境依存です。(確認できた環境では右から評価されるらしく 2, 2, 0
になりました)
そもそも ++
演算子は可読性も良くない気がします。自分はC言語でも i++
はforループの更新文以外では書かない流派に改宗しました。