切换两个没有临时存储的值

use*_*und 1 c++

我编写这段代码来切换两个没有临时存储的值,它运行良好,但是当我尝试使用相同的样式来做其他事情时,它不能像我预期的那样工作.

                `     
 #include <iostream>
 using namespace std;

 int main(){
   int i=100,j=200;
   //expect swich i and j
   i=j+i-(j=i);
   cout<<i<<"   "<<j<<endl;

   //expect j=100 and i=300 
   i=j+(j=i);
   cout<<i<<"   "<<j<<endl;
 } 
Run Code Online (Sandbox Code Playgroud)

结果是:

200    100
400    200
Run Code Online (Sandbox Code Playgroud)

那么为什么第二个(j=i)工作呢?

我们可以就这种情况进行讨论吗?没有人会维护这样的代码,包括我.

Dav*_*nan 8

这是未定义的行为(UB).可以按任何顺序评估+的操作数.您的代码的意图依赖于选择的一个特定订单,但您的编译器正在选择其他评估订单.不幸的是你.

这种经验应该足以说服你避免编写这样的代码.一旦你开始在表达式中引起副作用,你必须小心避免UB.交换时不要害怕使用本地临时变量.而且更不用担心使用标准库中内置的交换例程.

最后一点.您没有声明变量这一事实并不意味着生成的代码不会使用变量.它可能在寄存器中,但是那么,你认为编译器将你的temp int放在交换函数中的什么位置?


Bre*_*ale 5

您可以使用XOR交换:

i ^= j; j ^= i; i ^= j;

然而,今天的处理器却是虚假的经济.