C++ 检查所有变量是否等于c+中的相同值+;

C++ 检查所有变量是否等于c+中的相同值+;,c++,compare,C++,Compare,比较多个变量以确定它们是否都是相同值的最简单方法是什么? 例如,如果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==row

比较多个变量以确定它们是否都是相同值的最简单方法是什么? 例如,如果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==row3==row4==col1==col2==col3==col4==diag1==diag2)

cout它不起作用,因为
==
比较运算符返回
true
false
(它们是
1
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 vals[]={row1,row2,row3,row4,col1,col2,col3,col4,diag1,diag2};
布尔等于真;
对于(int i=0;i
我想即使使用按位循环也可以:

int val = vals[0];
for (int i = 1; i < sizeof(vals); ++i)
  val &= vals[i];
bool equals = val == vals[0];
int val=vals[0];
对于(int i=1;i
在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);
}
#包括
模板
布尔全等(T&T,U&U)
{
返回(t==u);
}
模板
布尔全等(T&&T,U&&U,Ts&&U…参数)
{
返回(t==u)和全部相等(u,std::forward(args)…);
}
int main()
{
int x=42;
int y=42

std::cout你不能像那样链接
=
操作符

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

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

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";
if(row1==row2&&row2==row3&&row3==row4&&row4==col1&&col1==col2&&col2==col3&&col3==col4&&col4==diag1&&diag1==diag2)

不能没有任何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);
}
#包括
布尔等于(int val1,int val2,int val3,int val4)
{
返回((val1 | val2 | val3 | val4)==(val1&val2&val3&val4));
}
int main()
{

std::cout我希望下面的信息将给出链“==”操作符如何工作的想法:

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

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

表达式a==b==c实际上是(a==b)==c,请参见表达式(a==b)==c的计算方法

•(a==b)将首先进行比较,并返回1(真)或0(假)

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


因此,我们不会使用chain“==”运算符进行多变量比较。

如果(row1==row2&&row2==row3&&row3==row4…
将以您想要的方式进行计算,因为如果row2==row1和row2==row3,那么row1==row3。长度是原来的两倍,但它可以工作。在js
2==2==2
中,返回
false
我不确定其他语言。这一定是我看过的关于“可变模板”的第十篇文章在过去的5分钟里。很好地使用了语言功能。@Derek:它们是非常普遍的索引这在javascript中也应该起作用吗?
1==1&&2==2
在javascript中返回
true
。@user31782:我对javascript不太了解,但我相信它的逻辑运算符遵循与C和相关语言相同的规则。我检查了你的代码无法正常运行。我有
intx=1;inty=1;inta=2;intb=2;int-check=0;if(x==y&&a==b){int-check=786;}
check
仍然保留
0
@user31782:你的示例有一个bug-删除第二个“int”否则,您将对变量
进行阴影检查
。好的。您的答案是正确的。我没有看到
row2
row1==row2&&row2==row3