Se stai arrivando alla programmazione da un background matematico, questo sottile dettaglio può facilmente coglierti in fallo.
C++ è un linguaggio di programmazione ampiamente utilizzato, ma anche uno in cui gli errori di programmazione sono più comuni. Molti di questi errori sono dovuti a errori logici. In particolare, gli errori commessi durante le operazioni di confronto possono influenzare l'accuratezza e l'affidabilità del codice.
Il linguaggio C++ ha un particolare errore di confronto che molti nuovi sviluppatori trascurano. Questo errore deriva da una comprensione errata del funzionamento degli operatori durante l'esecuzione di confronti multipli. Scopri come evitare questo errore comune e perché si verifica in primo luogo.
Confronti in C++
Il linguaggio di programmazione C++ offre molte funzionalità e strumenti diversi, insieme a operazioni di base come gli operatori di confronto. Gli operatori di confronto sono operazioni speciali nei linguaggi di programmazione che è possibile utilizzare per confrontare i dati tra loro. Gli sviluppatori usano questi operatori abbastanza spesso, specialmente durante la creazione di algoritmi.
Puoi vedere gli operatori di confronto in molti esempi diversi nella vita quotidiana. Ad esempio, quando fai acquisti al supermercato, utilizzi questi operatori in mente per confrontare i prezzi. Se il prezzo di un prodotto è inferiore all'altro, scegli quel prodotto.
Puoi vedere gli operatori di confronto in istruzioni if-else abbastanza spesso. Gli operatori di confronto sono il punto in cui verificare se un valore è maggiore, minore o uguale a un altro valore. C'è un piccolissimo ma importante dettaglio da non trascurare. I risultati delle espressioni di confronto restituiscono true o false, che sono valori booleani. Questi valori sono uno dei componenti fondamentali della struttura di controllo nella programmazione.
Ad esempio, nel linguaggio di programmazione C++, il "==" L'operatore controlla se due valori sono uguali. Se i valori sono uguali, il risultato restituisce true. In caso contrario, il risultato sarà falso.
Se (a == b)
{
ritornoVERO;
}
altro
{
ritornofalso;
}
Un esempio di un problema di confronto
Uno degli errori più comuni commessi dai principianti di C++ è l'uso di operatori di confronto. Questi operatori consentono ai programmatori di confrontare due valori ed eseguire operazioni diverse in base al risultato di tale confronto. Tuttavia, l'uso errato di questi operatori può causare errori imprevisti.
Ad esempio, sebbene l'espressione 3 < 15 < 10 sia matematicamente errata, C++ considera vero il suo risultato. Puoi dimostrarlo scrivendo il seguente semplice programma di test.
Innanzitutto, crea un file denominato prova.cpp. Apri questo file usando il tuo editor di codice preferito e aggiungi il seguente codice ad esso.
#includere
int un = 15;intprincipale()
{
Se (310)
{
standard::cout << "pippo" << standard::finel;
}
altro
{
standard::cout << "boo" << standard::finel;
}
ritorno0;
}
Puoi usare questo comando per compilare ed eseguire il codice:
g++ prova.cpp -o Prova
Ora hai un programma chiamato Test. Eseguire il programma ed esaminarne l'output.
C++ considerava vero 3 < 15 < 10 durante l'esecuzione di questo programma. Perché il risultato potrebbe venire fuori in questo modo, anche se è un'affermazione matematicamente errata?
Cause del problema del confronto in C++
Come la maggior parte dei linguaggi di programmazione, il C++ legge il codice da sinistra a destra. Ogni operatore di confronto produce un valore booleano. I valori booleani non significano solo vero e falso; hanno un equivalente matematico.
Il principio di funzionamento di a computer dipende da uno e zero. Per un computer, il risultato di qualcosa è vero o falso. I programmi per computer di solito trattano il numero 1 come vero e il numero 0 come falso.
Esamina nuovamente il problema del confronto e leggi l'affermazione da sinistra a destra; vedrai che ci sono due confronti diversi. Il primo confronto è tra i numeri 3 e 15. Questo è un valore vero perché 3 è minore di 15.
Il secondo confronto è tra quel risultato e il numero 10. Poiché deve eseguire un confronto numerico, C++ converte silenziosamente il valore vero booleano in 1. 1 è minore di 10, quindi il risultato complessivo è vero.
In conclusione, sebbene sembri un errore matematico, questa affermazione è vera per C++ e computer.
Come risolvere i problemi di confronto in C++
Il C++, insieme alla maggior parte degli altri linguaggi di programmazione, utilizza una sintassi diversa per il confronto logico rispetto alla matematica tradizionale. L'espressione matematica 3 < a < 15 significa “3 è minore di a E a è minore di 15.” Tuttavia, come hai visto, C++ interpreta questa espressione in modo diverso.
Per rappresentare e in C++, usa l'operatore &&. È quindi possibile concatenare insieme espressioni booleane e creare la logica utilizzando operatori come && rappresentare E, || per rappresentare OR, e ! rappresentare NON. Lingue come Java usa gli stessi operatori logici.
Usando l'operatore logico corretto, puoi correggere il bug nell'esempio precedente:
#includere
int un = 15;intprincipale()
{
Se (3 < un && un < 10)
{
standard::cout << "pippo" << standard::finel;
}
altro
{
standard::cout << "boo" << standard::finel;
}
ritorno0;
}
Ora questo codice verificherà se il valore a è maggiore di 3 e se il valore a è minore di 10. Compilare ed eseguire il programma e osservare il risultato.
L'esempio precedente stampava "foo", ma ora il programma stampa "boo", come previsto. Il valore booleano del lato sinistro del confronto (3 < a) è vero. Il valore del lato destro (a < 10) è falso. Da vero e falso è sempre falso, l'espressione complessiva restituisce false, quindi la condizione fallisce e il altro corse di blocco.
Prova a cambiare l'AND (&&) operatore a un OR (||) e osservando il diverso risultato.
L'importanza dei controlli logici in C++
I confronti logici in C++ implicano l'uso di valori booleani e operatori di confronto. Assicurati di utilizzare i valori booleani e gli operatori di confronto corretti per controllare il funzionamento dei tuoi programmi. Può essere difficile individuare espressioni mal formate perché il C++ eseguirà spesso un comportamento diverso piuttosto che fallire completamente.
Ora sai come i compilatori ignorano questo problema e trattano ogni confronto come un booleano durante la lettura da sinistra a destra. Fai attenzione a questo problema in qualsiasi lingua tu usi e impara a riconoscerne gli effetti in modo da poter essere un passo avanti.