【问题标题】:Check to see if all variable are equal to the same value in c++ [duplicate]检查所有变量是否等于c ++中的相同值[重复]
【发布时间】:2013-02-18 23:17:26
【问题描述】:

比较多个变量以查看它们是否都是相同值的最简单方法是什么? 例如,如果 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";

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

【问题讨论】:

  • if (row1 == row2 &amp;&amp; row2 == row3 &amp;&amp; row3 == row4 ... 将评估您想要的方式,因为如果 row2 == row1 和 row2 == row3 然后 row1 == row3。两倍的时间,但它有效。
  • 在 js 中 2 == 2 == 2 == 2 返回 false 我不确定其他语言。

标签: c++ compare


【解决方案1】:

在 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);
}

【讨论】:

  • 这应该是我在过去 5 分钟内看到的关于“可变参数模板”的第十篇文章了。
  • 善用语言特性。
  • @Derek:它们确实非常普遍
【解决方案2】:

您不能像这样链接== 运算符。你需要写,例如

if (row1==row2 && row2==row3 && row3==row4 && ...)

【讨论】:

  • 这也应该在javascript中工作吗? 1 == 1 &amp;&amp; 2==2 在 javascript 中返回 true
  • @user31782:我对 JavaScript 了解不多,但我相信它的逻辑运算符遵循与 C 及相关语言相同的规则。
  • 我检查了tutorialspoint.com/compile_cpp_online.php 你的代码不能正常工作。我有int x = 1; int y = 1; int a = 2; int b = 2; int check = 0; if(x == y &amp;&amp; a == b) { int check = 786; } check 仍然存在 0
  • @user31782:您的示例有一个错误 - 删除第二个“int”,否则您将隐藏变量 check
  • 好的。你的答案是正确的。我没有看到row2row1==row2 &amp;&amp; row2==row3 中是一样的
【解决方案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)的结果进行比较。

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

【讨论】:

    【解决方案4】:

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

    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];
    

    【讨论】:

      【解决方案5】:

      没有任何 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);
      }
      

      【讨论】:

        【解决方案6】:

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

        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";
        

        【讨论】:

          猜你喜欢
          • 2012-10-16
          • 1970-01-01
          • 2018-10-06
          • 2012-09-21
          • 1970-01-01
          • 2013-12-15
          • 1970-01-01
          相关资源
          最近更新 更多