8

我一直想知道为什么像交换两个变量的内容这样简单而基本的操作对于许多语言来说不是内置的。

它是计算机科学课程中最基本的编程练习之一;它在许多算法中大量使用(例如排序);时不时地需要它,并且必须使用临时变量或使用模板/通用函数。

它甚至是许多处理器上的基本机器指令,因此带有临时变量的标准方案将得到优化。

已经创建了许多不太明显的运算符,例如赋值运算符(例如 +=,它可能是为了反映累积的机器指令而创建的,例如 add ax,bx),或 ?? C# 中的运算符。

那么,是什么原因呢?还是它真的存在,而我总是错过它?

4

5 回答 5

11

根据我的经验,除了已经提到的排序算法和偶尔在低级硬件戳中之外,实际应用程序中通常不需要它,所以在我看来,在通用语言中它有点太特殊了.

如前所述,并非所有处理器都支持它作为指令(并且许多处理器不支持大于单词的对象)。因此,如果它支持一些有用的附加语义(例如,作为原子操作),则很难在某些处理器上支持,如果它没有附加语义,那么它只是(很少使用)合成糖。

支持分配运算符(+= 等),因为它们在现实世界的程序中更为常见 - 因此它们提供的语法糖更有用,而且作为一种优化 - 记住 C 可以追溯到 60 年代末/70 年代初,并且编译器优化没有那么先进(而且机器能力较差,所以无论如何你都不想要冗长的优化过程)。

保罗

于 2008-11-13T08:28:58.523 回答
5

C++确实有交换。

#include <algorithm>
#include <cassert>

int
main()
{
    using std::swap;
    int a(3), b(5);
    swap(a, b);
    assert(a == 5 && b == 3);
}

此外,您也可以专注swap于自定义类型!

于 2008-11-13T08:48:46.923 回答
3

这是计算机科学课程中广泛使用的示例,但我几乎从未发现自己在实际代码中需要它——而我经常使用 +=。

是的,在排序时它会很方便——但您不需要自己实现排序,因此源代码中的实际使用次数仍然很低。

于 2008-11-13T08:29:22.767 回答
0

您确实有XOR 运算符对原始类型进行变量替换...

于 2008-11-13T08:10:28.357 回答
-1

我想他们只是忘了添加它 :-) 是的,不是所有的 CPU 都有这种指令,那又如何呢?我们还有很多其他的东西,大多数 CPU 没有指令来计算。如果我们拥有它,它会更容易/更清晰,也更快(通过内在)!

于 2008-11-13T08:41:40.417 回答