Programming languages 为什么';交换运算符存在于命令式语言或面向对象语言中,如C/C++/C#/Java。。。?

Programming languages 为什么';交换运算符存在于命令式语言或面向对象语言中,如C/C++/C#/Java。。。?,programming-languages,language-design,Programming Languages,Language Design,我一直想知道为什么许多语言都没有内置像交换两个变量的内容这样简单而基本的操作 它是计算机科学课程中最基本的编程练习之一;它在许多算法中大量使用(例如排序);偶尔需要它,并且必须使用临时变量或模板/泛型函数 它甚至是许多处理器上的基本机器指令,因此带有临时变量的标准方案将得到优化 创建了许多不太明显的运算符,如赋值运算符(例如+=,可能是为了反映累积的机器指令而创建的,例如add ax、bx)或??C#中的运算符 那么,原因是什么?或者它真的存在,而我总是错过它吗?你确实有一个对原始类型进行变量替

我一直想知道为什么许多语言都没有内置像交换两个变量的内容这样简单而基本的操作

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

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

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


那么,原因是什么?或者它真的存在,而我总是错过它吗?

你确实有一个对原始类型进行变量替换的方法…

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

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

assignment操作符(+=etc)之所以得到支持,是因为它们在现实世界的程序中更为常见——因此它们提供的合成糖更为有用,同时也是一种优化——记住C是60年代末70年代初的,编译器优化并没有那么先进(而且机器的性能较差,因此无论如何,您都不希望获得冗长的优化过程)


Paul

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


是的,在排序中它会很方便-但是你不需要自己实现排序,所以在源代码中实际使用的数量仍然很低。

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

C++确实有交换功能

#include <algorithm>
#include <cassert>

int
main()
{
    using std::swap;
    int a(3), b(5);
    swap(a, b);
    assert(a == 5 && b == 3);
}
#包括
#包括
int
main()
{
使用std::swap;
INTA(3)、b(5);
掉期(a、b);
断言(a==5&&b==3);
}

此外,您还可以专门为自定义类型交换
swap

这只是一个已定义的函数。我的意思是,为什么它不是直接内置的。不一定会更快-编译器可以内联调用swap(我可以想象一些已经内联调用了),如果它真的是性能关键的。那么底层硬件呢,如果它有XCHG或类似的指令,交换将在不需要临时变量的情况下完成,并且执行速度更快。有更多的内在比内联!。。。优化不仅仅是内联。编译器能够确定何时发生交换(识别临时变量并使用XCHG并不是那么困难)。回答不错。但是有更多的算法可以使用它:Fisher-Yales算法(现代版)、Steinhaus-Johnson-Trotter算法、矩阵变换。在更专业的领域,它被用作降低空间复杂性的论据。我承认这些都是专门情况。“这些都是专门情况”。一个优化编译器在发现模式时仍然可以使用本机交换指令,因此引用的专门情况甚至不需要。一些语言(如Python)具有并行赋值,哪一个更通用,不需要对称交换2个值。问得好。我也很想知道这一点,尽管响应是有意义的。在QBasic中确实存在SWAP语句。比“SWAP two variables”宏更有趣的是,它的行为类似于逗号运算符,但其值是第一个操作数的值。假设操作符写为“=:”(我真的不知道什么符号是好的)。然后“x=(y=:y=x)”将交换x和y。其他用途可能是,例如,“return(y=:y+=4)”在概念上与post increment运算符类似,但增量为4而不是1。@supercat:“x,y=y,x”在python中称为并行赋值。@Jürgen Strobel:我认为我的运算符在更多上下文中是有用的。据我所知,上面的指令要求Python计算右边的所有内容,然后按顺序将它们分配给左边的内容。我考虑的更多的场景是,一个函数返回修改某些内容,但返回修改之前的值。交换两个左值并不常见,但同时存储和读取一个左值是很常见的。从某种意义上说,这就是postfix++和--运算符所做的(它们存储修改后的值,但传播到表达式其余部分的值是预更新值)。但是,如果要交换的两个对象具有相同的存储位置,则可能会导致错误。它会把它们归零。我还被告知,在现代处理器上,它的效率不如只使用临时变量。