9

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.

user1825241
  • 846
  • 4
  • 9
  • 17
  • 3
    `if (row1 == row2 && row2 == row3 && row3 == row4 ...` will evaluate the way you want, since if row2 == row1 and row2 == row3 then row1 == row3. Twice as long, but it works. – jonhopkins Mar 04 '13 at 18:52
  • In js `2 == 2 == 2 == 2` returns `false` I am not sure about other languages. – user31782 Jan 11 '17 at 14:46

6 Answers6

18

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);
}
Andy Prowl
  • 124,023
  • 23
  • 387
  • 451
4

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

if (row1==row2 && row2==row3 && row3==row4 && ...)
Paul R
  • 208,748
  • 37
  • 389
  • 560
  • Is this supposed to be work in javascript too? `1 == 1 && 2==2` returns `true` in javascript. – user31782 Jan 11 '17 at 14:01
  • @user31782: I don't know much about JavaScript, but I believe its logical operators follow the same rules as C and related languages. – Paul R Jan 11 '17 at 14:03
  • I checked on https://www.tutorialspoint.com/compile_cpp_online.php your code doesn't work correctly. I had `int x = 1; int y = 1; int a = 2; int b = 2; int check = 0; if(x == y && a == b) { int check = 786; } `. `check` still remains `0` – user31782 Jan 11 '17 at 14:28
  • @user31782: your example has a bug - remove the second "int" otherwise you are shadowing the variable `check`. – Paul R Jan 11 '17 at 14:48
  • sorry for last wrong comment. With this `int x = 1; int y = 1; int a = 2; int b = 2; int check = 0; if(x == y && a == b) { check = 786; cout << check;}` It is outputing check's value 786. But the if condition should not be executed because all variables are not equal. – user31782 Jan 11 '17 at 14:52
  • 2
    Ok. Your answer is correct. I didn't see `row2` is same in `row1==row2 && row2==row3 ` – user31782 Jan 11 '17 at 14:52
4

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.

2

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];
Jack
  • 131,802
  • 30
  • 241
  • 343
1

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);
}
Cubi
  • 21
  • 8
0

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";
spartacus
  • 613
  • 6
  • 12