这是一个未定义的行为吗?我能不用温度交换价值吗?

Sev*_*eux 0 c++ c++11 c++14

我可以使用元组和领带交换两个变量吗?

int x, y;
....
std::tie(y, x) = std::make_tuple(x, y);
Run Code Online (Sandbox Code Playgroud)

Che*_*Alf 5

std::make_tuple 创建一个元组实例,一个参数的副本,因此使用它来分配回原始变量没有问题.

然而std::swap,它不是惯用的,而是比简单使用更迂回,即它不是人们所期望的代码,所以我不会这样做.

关于效率,仅仅因为总是出现这样的问题,这完全取决于编译器:所有可以说的是,如果重要的话,衡量.


该std::make_tuple交换使用临时,即元组.

要在不使用临时变量的情况下挖掘基本积分类型的两个变量的值,您可以使用旧的XOR技巧:

x ^= y;
y ^= x;    // Sets y = original x value by cancelling the original y bits.
x ^= y;    // Sets x = original y value by cancelling the original x bits.
Run Code Online (Sandbox Code Playgroud)

对于无符号类型,这是明确定义的.对于签名类型if,它是正式的Undefined Behavior这两个值中的任何一个都是负数 任何中间值都不能在类型中表示.

  • 我喜欢用*exhcange*^^交换字母的拼写错误 (2认同)