8

比较多个变量以查看它们是否都是相同值的最简单方法是什么?例如,如果 var1 = 53 并且我想检查 var2 或 var3 是否等于 var1 并且彼此相等?到目前为止,我已经这样做了:

if(row1==row2==row3==row4==col1==col2==col3==col4==diag1==diag2)
    cout << "It is a magic square";
else
    cout << "Not a magic square";

但是,这似乎不起作用。谢谢你的帮助。

4

6 回答 6

16

在 C++11 中,您可以使用可变参数模板来定义自己的函数:

#include <iostream>

template<typename T, typename U>
bool all_equal(T&& t, U&& u)
{
    return (t == u);
}

template<typename T, typename U, typename... Ts>
bool all_equal(T&& t, U&& u, Ts&&... args)
{
    return (t == u) && all_equal(u, std::forward<Ts>(args)...);
}

int main()
{
    int x = 42;
    int y = 42
    std::cout << all_equal(42, y, x);
}
于 2013-03-04T18:53:48.137 回答
4

你不能==像这样链接运营商。你需要写,例如

if (row1==row2 && row2==row3 && row3==row4 && ...)
于 2013-03-04T18:53:52.693 回答
3

我希望以下信息能让您了解链“==”运算符的工作原理:

由于 C 语言不支持像 a==b==c 这样的链式比较;每个等于运算符 (==) 仅对两个操作数进行操作。那么表达式 a==b==c 是如何计算的呢?

根据运算符关联性等于运算符(==)从左到右操作,这意味着相等运算符(==)的关联性是从左到右。

表达式 a==b==c 实际上是 (a==b) ==c,看看表达式 (a==b) ==c 是如何计算的?

•(a==b) 将首先进行比较并返回 1 (true) 或 0 (false)。

• 然后将变量c 的值与(a==b) 的结果进行比较。

所以我们不会使用链式 '==' 运算符进行多变量比较。

于 2017-11-29T09:33:44.760 回答
2

它不起作用,因为==比较运算符返回trueor false(它们是1or 0)。为了避免进行成对比较,我想最好的方法是使用循环:

int vals[] = {row1,row2,row3,row4,col1,col2,col3,col4,diag1,diag2};
bool equals = true;
for (int i = 0; i < sizeof(vals); ++i) {
  if (vals[i] != vals[i+1]) {
    equals = false;
    break;
  }
}

我想它甚至可以使用按位循环:

int val = vals[0];
for (int i = 1; i < sizeof(vals); ++i)
  val &= vals[i];
bool equals = val == vals[0];
于 2013-03-04T18:53:33.250 回答
1

没有任何 if 的解决方案

#include <iostream>

bool equals(int val1, int val2, int val3, int val4)
{
    return((val1 | val2 | val3 | val4) == (val1 & val2 & val3 & val4));
}

int main()
{
  std::cout << "1, 1, 1, 1 -> " << (equals(1, 1, 1, 1)?"true":"false") << std::endl;
  std::cout << "0, 0, 0, 0 -> " << (equals(0, 0, 0, 0)?"true":"false") << std::endl;
  std::cout << "0, 0, 1, 1 -> " << (equals(0, 0, 1, 1)?"true":"false") << std::endl;
  std::cout << "3, 3, 1, 1 -> " << (equals(3, 3, 1, 1)?"true":"false") << std::endl;
  std::cout << "-5, -5, -5, -5 -> " << (equals(-5, -5, -5, -5)?"true":"false") << std::endl;
  return(0);
}
于 2017-07-28T08:27:17.210 回答
0

您将需要使用 && 运算符,尽管这会增加您需要键入的代码量。如果您要比较矩阵的值,我建议使用循环和索引来比较这些值,而不是将它们分配给变量并测试是否相等。

if(row1==row2 && row2==row3 && row3==row4 && row4==col1 && col1==col2 && col2==col3 &&   col3==col4 && col4==diag1 && diag1==diag2)
    cout << "It is a magic square";
else
    cout << "Not a magic square";
于 2013-03-04T18:54:24.583 回答