gpt4 book ai didi

C++ 赋值副作用

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:27:50 27 4
gpt4 key购买 nike

在尝试确保两个变量的升序时,我在 Visual Studio 2012 C++ 编译器中遇到了奇怪的异常情况,可以通过以下代码片段说明

    double x1 = 2;
double x2 = 1;
std::tie(x1, x2) = std::minmax(x1, x2);
std::cout << "x1 = " << x1 << ", x2 = " << x2 << "\n";

人们会期望 x1 为 1,x2 为 2。但事实并非如此。相反

    //output:
//x1 = 1, x2 = 1

有什么好的解释,以免再次落入类似的陷阱吗?

最佳答案

std::minmax通过引用返回它的参数。你的陈述会发生什么,首先是 x1被赋值为 x2 ,即 1。然后,x2被赋值为 x1 ,这是 2,但现在是 1。

如果你要内联所有内容,它可能看起来像这样:

// using pointers because references can't be rebound
double *less, *greater;

if (x1 <= x2)
{
less = &x1;
greater = &x2;
}
else
{
// in your case, this is the branch taken
less = &x2;
greater = &x1;
}

x1 = *less; // less points to x2, so now both x1 and x2 = 1
x2 = *greater; // greater points to x1, and x1 = 1, so this assignment is redundant

我认为您的部分困惑来自于认为(或希望)分配会同时发生,但事实并非如此。当您分配 tuplepair , 子对象按从左到右的顺序分配。

关于C++ 赋值副作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17380547/

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