programming-languages - 为什么 C/C++/C#/Java 等命令式或 OO 语言中不存在交换/交换运算符?

标签 programming-languages language-design

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

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

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

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

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

最佳答案

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

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

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

保罗

关于programming-languages - 为什么 C/C++/C#/Java 等命令式或 OO 语言中不存在交换/交换运算符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/286481/

相关文章:

mysql - 通过批处理脚本创建mysql odbc连接

c - getchar() 和 putchar()

java - 为什么 String switch 语句不支持 null 情况?

asynchronous - 等待而不将函数声明为异步

compiler-construction - 自然编程语言……你想看什么?

ruby - 以性能为中心的桌面程序 : Ruby or Go?

multithreading - 如何在一个类中创建线程?

c++ - 为什么 C/C++ 字符串文字声明必须是单行的?

compiler-construction - 在设计编译器时,处理递归是否需要特殊处理?

scripting - 游戏脚本需要哪些语言功能?