Check to see if all variable are equal to the same value in c++ [duplicate]

試著忘記壹切 提交于 2019-12-04 03:15:14

问题


What is the easiest way to compare multiple variable to see if they are all the same value? For example if var1 = 53 and I want to check if var2 or var3 is equal to var1 and each other? So far I have done this:

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

However this doesn't seem to work. Thanks for you help.


回答1:


You can't chain == operators like that. You would need to write, e.g.

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



回答2:


In C++11, you could use variadic templates to define your own function:

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



回答3:


I hope this below information will give an idea about how chain '==' operator works:

Since C language does not support chaining comparison like a==b==c; each equal to operator (==) operates on two operands only. Then how expression a==b==c evaluates?

According to operators associativity equal to operator (==) operates from left to right, that means associativity of equal operator (==) is left to right.

Expression a==b==c is actually (a==b) ==c, see how expression (a==b) ==c evaluates?

•(a==b) will be compared first and return either 1 (true) or 0 (false).

•Then value of variable c will be compared with the result of (a==b).

So we won't use chain '==' operator for multiple variable comparison.




回答4:


It doesn't work because the == comparison operator returns true or false (which are 1 or 0). To avoid doing pairwise comparisons I guess the best way is to use a loop:

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

I guess it would work even with a bitwise loop:

int val = vals[0];
for (int i = 1; i < sizeof(vals); ++i)
  val &= vals[i];
bool equals = val == vals[0];



回答5:


You would need to use the && operator although this would increase the amount of code you need to type. If you are comparing values of a matrix I would suggest using a loop and indices to compare the values instead of assigning them to variables and testing for equality.

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



回答6:


A solution without any 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);
}


来源:https://stackoverflow.com/questions/15208831/check-to-see-if-all-variable-are-equal-to-the-same-value-in-c

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!