为什么 Rust 中没有自增和自减运算符?

Tho*_*rge 5 rust

许多其他语言中都包含++和运算符。--为什么语言设计者选择不在 Rust 中包含这些运算符?

Tho*_*rge 11

它们不包含在 Rust 中,因为它们可能会导致微妙的错误,因为它们需要有关计算顺序的复杂知识,特别是当组合成更大的表达式时,如下所示。你能猜出这两个 C++ 程序打印什么吗?我猜错了。

#include <cstdio>
int main()
{
    int a = 4;
    int b = 4;
    int c = a++ + b++;
    printf ("%i %i %i", a, b, c);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)
#include <cstdio>
int main()
{
    int x = 10;
    int z = ++x + x++;
    printf ("%i %i", x, z);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

来自常见问题解答

为什么 Rust 没有自增和自减运算符?

预增量和后增量(以及相应的减量)虽然方便,但也相当复杂。它们需要了解计算顺序,并且通常会导致 C 和 C++ 中的微妙错误和未定义的行为。x = x + 1 或 x += 1 只是稍微长一点,但很明确。

  • `a++ + b++` 定义明确:编译器可以选择计算 `a++` 和 `b++` 的顺序,以及是否在递增 `a` 和 `b` 之前先计算加法,或者是否存储`的原始值a` 和 `b` 临时存在,并在执行加法之前递增它们,但所有这些都会导致 `a=b=5` 和 `c=8`。 (4认同)
  • `++x + x++` 定义不明确:编译器可以选择以任何顺序计算增量和加法,这可能导致 `z` 为 21、22 或 23,具体取决于所选顺序。 (3认同)
  • 我实际上认为 `int z = ++x + x++;` 行的行为在 C++ 标准中是未定义的,因为我发现一篇博客文章指出这应该打印 `12 22`,但在在线编译器中我使用[1],这会打印“12 23”。[0]:https://hackernoon.com/increment-and-decrement-operators-in-cc-6c1c3u63 [1]:https://www.onlinegdb.com/online_c++_compiler,这个 (2认同)
  • IIRC this (`a++ + b++`, `++x + x++`) 是未定义的行为。但不确定。 (2认同)