C++ 使用相同条件缩短if语句

C++ 使用相同条件缩短if语句,c++,if-statement,C++,If Statement,有没有办法缩短这样的if语句: ifx==1&&y==1&&z==1->ifx&&y&&z==1或ifx,y,z==1 编辑:很抱歉给您带来不便。在我的手机上做得很快。以下是一个完整的示例: 这是我连接四人游戏的一部分 bool checkwin(string player) { for (int i = 0; i<10; i++) { for (int j = 0; j<10; j++) { if (grid[i][j] == pl

有没有办法缩短这样的if语句:

ifx==1&&y==1&&z==1->ifx&&y&&z==1或ifx,y,z==1

编辑:很抱歉给您带来不便。在我的手机上做得很快。以下是一个完整的示例:

这是我连接四人游戏的一部分

bool checkwin(string player) {
    for (int i = 0; i<10; i++) {
        for (int j = 0; j<10; j++) {
            if (grid[i][j] == player && grid[i + 1][j] == player && grid[i + 2][j] == player && grid[i + 3][j] == player) {
                return 1;
            }
            if (grid[i][j] == player && grid[i][j + 1] == player && grid[i][j + 2] == player && grid[i][j + 3] == player) {
                return 1;
            }

            if (grid[i][j] == player && grid[i + 1][j + 1] == player && grid[i + 2][j + 2] == player && grid[i + 3][j + 3] == player) {
                return 1;
            }

            if (grid[i][j] == player && grid[i - 1][j + 1] == player && grid[i - 2][j + 2] == player && grid[i - 3][j + 3] == player) {
                return 1;
            }
        }
    }
}
如果将int数据存储在数组中,则可以执行include检查,并使If语句成为单个条件语句。

实际上,如果使用C++11或更高版本,则可以进行一些缩短:

#include <iostream>
#include <string>
#include <tuple>

int main() {
    int x = 1;
    std::string y = "Hello";
    double z = 3.14;

    if(std::make_tuple(x, y, z) == std::make_tuple(1, "Hello", 3.14))
        std::cout << "Everything is okay." << std::endl;
    else
        std::cout << "Something went wrong." << std::endl;

    return 0;
}
但是请记住,当您必须同时测试多个输入,或者必须为您的类型重载输入时,这些技术非常方便。在您的示例中,正如注释所指出的,这也是不必要的,x==1&&y==1&&z==1已经足够简单了

编辑问题后,很明显,您打算使用objects std::string进行比较。在这种情况下,每次进行比较时都将它们复制到std::tuple或数组中,这将严重影响性能

与if语句中的表达式相比,为了避免产生很大的开销,可以使用如下方法:

template<typename T, typename... Args>
bool equalToAll(T&& test, Args&&... args) {
    bool result = true;
    bool dummy[] { false, (result &= (test == args))... };
    return (static_cast<void>(dummy), result);
}

// Usage:
// equalToAll(player, grid[i][j], grid[i + 1][j], grid[i + 2][j], grid[i + 3][j])

此示例使用列表初始值设定项执行参数包扩展,您可以阅读更多信息。

如果要检查所有变量是否彼此相等,可以编写此类帮助程序

template <typename T>
bool all_equal(const std::initializer_list<T>& l) {
    return std::equal(l.begin() + 1, l.end(), l.begin());
}

在线版本:

关注代码的可读性。让编译器优化代码。@RudyM x,y和z可能是一个非常合理的名称,例如,如果您引用的是三维坐标。是否要保存键入?你想在屏幕上放更多的代码吗?您是否试图使代码更易于阅读和理解?你为什么要短一点的?你需要多久做一次?可能真正的问题是,是什么原因导致您需要频繁地执行此操作,以至于您希望它变短,也许其他地方的更改可以解决此问题。不确定您所说的缩短是什么意思,但如果x、y和z是无符号整数,则您没有说明它们的类型,如果x*y*z==1怎么样?@franji1假设您不担心溢出。Whaaaaaaaa-huh??例如,在Ruby中,如果[1,2,3],您可以执行[1,2,3]。include?input do。。。终止只是用Ruby来说明这一点。我无法想象这比连续的&&更可取,并且要求它已经在一个数组中。@那么,除了描述之外,为什么只提供模糊的代码描述,而不是实际的示例?很难理解你的答案。我们不是在谈论Ruby。我们在谈论C++。试着用其他语言的方式做事情,这就是你如何到达OP现在所处的位置,困惑。您还假设OP理解Ruby或您所指的概念。
template <typename T>
bool all_equal(const std::initializer_list<T>& l) {
    return std::equal(l.begin() + 1, l.end(), l.begin());
}
if (all_equal({a, b, c}))