Frage Überprüfen Sie, ob alle Variablen in c ++ dem gleichen Wert entsprechen


Was ist der einfachste Weg, mehrere Variablen zu vergleichen, um zu sehen, ob sie alle den gleichen Wert haben? Zum Beispiel wenn var1 = 53 und ich überprüfen möchte, ob var2 oder var3 gleich var1 und einander ist? Bisher habe ich das getan:

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

Dies scheint jedoch nicht zu funktionieren. Danke für deine Hilfe.


5
2018-03-04 18:49


Ursprung


Antworten:


Sie können nicht verketten == Betreiber so. Sie müssten schreiben, z.B.

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

3
2018-03-04 18:53



In C ++ 11 können Sie variadische Vorlagen verwenden, um Ihre eigene Funktion zu definieren:

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

11
2018-03-04 18:53



Es funktioniert nicht, weil die == Vergleichsoperator gibt zurück true oder false (welche sind 1 oder 0). Um zu vermeiden, paarweise Vergleiche zu machen, denke ich, der beste Weg ist, eine Schleife zu verwenden:

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

Ich denke, es würde sogar mit einer bitweisen Schleife funktionieren:

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

2
2018-03-04 18:53



Ich hoffe, dass die folgenden Informationen eine Vorstellung davon geben, wie der Operator '' == 'funktioniert:

Da die C-Sprache keinen Verkettungsvergleich wie a == b == c unterstützt; Jeder Operator gleich (==) arbeitet nur mit zwei Operanden. Wie wird dann der Ausdruck a == b == c ausgewertet?

Nach Operatoren funktioniert die Assoziativität gleich dem Operator (==) von links nach rechts, dh die Assoziativität des gleichen Operators (==) ist von links nach rechts.

Ausdruck a == b == c ist eigentlich (a == b) == c, siehe, wie Ausdruck (a == b) == c auswertet?

• (a == b) wird zuerst verglichen und gibt entweder 1 (wahr) oder 0 (falsch) zurück.

• Dann wird der Wert der Variablen c mit dem Ergebnis von (a == b) verglichen.

Wir werden also den Operator '' == '' nicht für den Vergleich mehrerer Variablen verwenden.


2
2017-11-29 09:33



Sie müssten den Operator && verwenden, obwohl dies die Menge an Code erhöhen würde, die Sie eingeben müssen. Wenn Sie Werte einer Matrix vergleichen, würde ich vorschlagen, eine Schleife und Indizes zu verwenden, um die Werte zu vergleichen, anstatt sie Variablen zuzuordnen und auf Gleichheit zu prüfen.

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

0
2018-03-04 18:54



Eine Lösung ohne irgendein wenn

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

0
2017-07-28 08:27