gpt4 book ai didi

c++ - 在没有临时存储的情况下切换两个值

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:05:18 24 4
gpt4 key购买 nike

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

                `     
#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;
}

结果是:

200    100
400 200

那么为什么第二个 (j=i) 不起作用?

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

最佳答案

这是未定义的行为 (UB)。 + 的操作数可以按任何顺序计算。您的代码的意图取决于所选择的一个特定顺序,但您的编译器正在选择另一个评估顺序。你真倒霉。

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

最后一点。您不声明变量的事实并不意味着生成的代码不会使用变量。它可能在寄存器中,但那又怎样,您认为编译器会将您的临时 int 放在交换函数中的什么位置?

关于c++ - 在没有临时存储的情况下切换两个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8265641/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com