问题
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