可能重复:
交换两个变量值而不使用第三个变量
我在 Quora 上看到了这段代码。对于 C:
a^=b^=a^=b;
对于 Ruby/Python:
a,b=b,a
a ^= b ^= a ^=b;
^
是二元异或运算符。请注意,此代码具有未定义的行为: 和 的值在两个序列点a
之间b
被修改两次。
C 示例使用了几个愚蠢的技巧来交换两个数字,您可以在这个相同的问题中阅读。
Ruby/Python 示例使用元组解包,这更加明智/可读。
更多详情:
C:这是没有第三个变量的大肆吹嘘的交换的变体,但它不可读,具有未定义的行为(正如 Kirilenko 指出的那样)并且通常是一个坏主意。整数版本有溢出问题引导。在 C++ 中,只需使用std::swap(a,b)
,因为它可以正常工作。编写交换方法时要非常小心的一件事是,您可能会两次传递相同的东西,特别是如果您在 C 中使用引用或指针。
Ruby/Python:元组由 a 和 b 的值构成,并且通过拆分匿名元组并分配各个变量值来解释对以逗号分隔的变量列表的赋值。该方法确实使用了“第三个变量”,即匿名元组。