如何简化检查一对数字是 (1,2) 还是 (2,1)?

How to simplify checking if a pair of numbers is (1,2) or (2,1)?

我需要确保一对数字是 (1, 2) 或 (2, 1)。 x 和 y 始终为正。我现在使用的代码:

if ((x == 2 && y == 1) ||
    (x == 1 && y == 2)) {
    return 1;
}

看起来有点笨重,感觉可以简化一下。然而,我尝试的一切都导致了误报。

这是最直接的比较方式。

它也比您可能想出的任何替代方案都更具可读性,因此无需更改它。

我能看到你简化它的唯一方法是用一个结构来代表你 xy,如果这是某种坐标,你可以使用类似 vector2dstd::pair<int, int>

那么你可以这样做:

    std::pair<int, int> valuePair = std::make_pair(x, y);
    if (valuePair == std::make_pair(1, 2) || valuePair == std::make_pair(2, 1))
    {
        return 1;
    }

下面是一种我认为更具可读性的写法:

if (std::set{x,y} == std::set{1,2})
{
    return 1;
}

请注意,这不如您问题中的版本有效。例如,不要在要作为库发布的代码中编写此代码。但是,当性能不是问题时,在您自己的程序中编写是完全合理的。

这里是 demo

值可以为0吗?有人说0不是正数也不是负数。

如果 X 和 Y 都 > 0,那么:

if( 3 == (x + y) ) { return 1; }

您可能会(滥用)使用 std::minmax:

if (std::minmax(x, y) == std::pair<const int&, const int&>{1, 2})
{
    return 1;
}

if (std::minmax(x, y) == std::minmax(1, 2))
{
    return 1;
}

或 (C++17)

if (auto [a, b] = std::minmax(x, y); a == 1 && b == 2)
{
    return 1;
}