2013-03-04 18 views
5

Qual è il modo più semplice per confrontare più variabili per vedere se sono tutti dello stesso valore? Ad esempio se var1 = 53 e voglio verificare se var2 o var3 è uguale a var1 e l'un l'altro? Finora ho fatto questo:Controllare se tutte le variabili sono uguali allo stesso valore in C++

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

Tuttavia questo non sembra funzionare. Grazie per il tuo aiuto.

+3

'if (row1 == row2 && row2 == row3 && row3 == row4 ...' valuterà il modo desiderato, poiché se row2 == row1 e row2 == row3 then row1 == row3. lungo, ma funziona. – jonhopkins

+0

In js '2 == 2 == 2 == 2' restituisce' false' Non sono sicuro delle altre lingue – user31782

risposta

3

non puoi catena == operatori del genere. Dovresti scrivere, ad es.

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

Si suppone che funzioni anche in javascript? '1 == 1 && 2 == 2' restituisce' true' in javascript. – user31782

+0

@ user31782: Non so molto di JavaScript, ma credo che i suoi operatori logici seguano le stesse regole di C e dei linguaggi correlati. –

+0

Ho controllato su https://www.tutorialspoint.com/compile_cpp_online.php il tuo codice non funziona correttamente. Ho avuto 'int x = 1; int y = 1; int a = 2; int b = 2; int check = 0; if (x == y && a == b) { int check = 786; } '. 'check' rimane ancora' 0' – user31782

2

Non funziona perché l'operatore == confronto restituisce true o false (che sono 1 o 0). Per evitare di fare confronti a coppie Credo che il modo migliore è quello di utilizzare un ciclo:

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

Credo che avrebbe funzionato anche con un ciclo bit per bit:

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

In C++ 11, è possibile utilizzare modelli variadic per definire la propria funzione:

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

Questo deve essere il decimo post che ho visto sui "modelli variadici" in negli ultimi 5 minuti – Derek

+0

Buon uso delle funzionalità del linguaggio. –

+0

@Derek: Sono piuttosto pervasivi infatti –

0

Lei avrebbe bisogno di utilizzare l'operatore & & anche se questo avrebbe aumentato la quantità di codice è necessario digitare. Se si confrontano i valori di una matrice, suggerirei di utilizzare un ciclo e indici per confrontare i valori anziché assegnarli a variabili e test per l'uguaglianza.

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

una soluzione senza alcun se

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

Spero che questo seguito sono riportate informazioni vi darà un'idea di come funziona la catena operatore '==':

Dal linguaggio C non supporta il concatenamento confronto come un == b == c; ognuno uguale all'operatore (==) funziona solo su due operandi. Quindi come valuta a == b == c valuta?

In base all'operatore, l'associatività uguale all'operatore (==) opera da sinistra a destra, ovvero l'associatività dell'operatore uguale (==) viene lasciata a destra.

Espressione a == b == c è in realtà (a == b) == c, vedere come viene valutata l'espressione (a == b) == c?

• (a == b) verrà confrontato per primo e restituito 1 (vero) o 0 (falso).

• Quindi il valore della variabile c verrà confrontato con il risultato di (a == b).

Quindi non useremo l'operatore chain '==' per il confronto di variabili multiple.

Problemi correlati