Menu
Coddy logo textTech

Cos'è un errore logico?

Un errore logico è uno sbaglio nel ragionamento di un programma che gli fa produrre un risultato sbagliato senza andare in crash e senza mostrare alcun messaggio di errore. Il codice è valido e ogni riga viene eseguita, ma non fa ciò che chi lo ha scritto voleva.

Di Kevin Spektor, Cofondatore e CTO

Aggiornato il 24 settembre 2026

Tre voti, 80, 90 e 100, hanno una media di 90. Questo programma viene eseguito senza una sola lamentela e stampa qualcos'altro:

Average: 203.33333333333334

Python ha fatto esattamente ciò che dice la riga. La divisione avviene prima dell'addizione, quindi solo l'ultimo voto è stato diviso per 3, e il risultato è 80 + 90 + 33,33. Chi l'ha scritto intendeva (scores[0] + scores[1] + scores[2]) / 3. Aggiungi le parentesi e il programma stampa Average: 90.0.

Perché non compare alcun messaggio di errore

Un computer controlla se il codice è valido, non se è corretto. Il parser controlla la grammatica, e così scopre un errore di sintassi. Il runtime controlla ogni operazione, e così scopre un errore di runtime come la divisione per zero. Sommare tre numeri e dividerne uno per 3 è grammatica valida e un'operazione lecita, quindi entrambi i controlli vengono superati.

Solo chi ha scritto il programma sa che doveva calcolare una media. Quell'intenzione non esiste da nessuna parte nel codice, quindi nessuno strumento può confrontarci il risultato. Un errore logico è la distanza tra ciò che hai detto al computer di fare e ciò che volevi che facesse.

Cause comuni degli errori logici

La maggior parte degli errori logici viene da un breve elenco di schemi.

  • Errori di uno (off-by-one). Un ciclo gira una volta di troppo o di meno. range(1, 5) produce 1, 2, 3 e 4, perché la fine è esclusa. Vedi iterazione.
  • Precedenza degli operatori. a + b / 2 divide solo b, come nella media qui sopra.
  • Il confronto sbagliato. < dove serviva <=, oppure and dove serviva or. Le condizioni sono espressioni booleane, e un operatore sbagliato capovolge il risultato per alcuni input.
  • Condizioni nell'ordine sbagliato. In una catena di if ed elif vince la prima condizione vera, quindi un test generico messo per primo nasconde quelli più specifici sotto di esso.
  • La variabile sbagliata. Aggiornare total dentro un ciclo ma stampare subtotal.
  • Supposizioni sui numeri. 0.1 + 0.2 == 0.3 è False in Python, Java e JavaScript, perché i numeri in virgola mobile sono approssimazioni. 7 // 2 fa 3, non 3,5.

Ecco l'errore sull'ordine delle condizioni. Un punteggio di 95 dovrebbe essere una A:

D
D
F

95 è maggiore o uguale a 60, quindi vince il primo ramo e l'elif non viene mai raggiunto. Metti per prima la soglia più alta e ogni risultato diventa giusto.

Tipi di errori in programmazione

Gli errori di programmazione di solito si dividono in tre tipi in base a quando compaiono e a cosa li segnala.

Errore di sintassiErrore di runtimeErrore logico
Quando comparePrima che il programma venga eseguitoDurante l'esecuzioneDurante l'esecuzione, o mai notato
Cosa lo rilevaIl parser o il compilatoreIl runtime o il sistema operativoUna persona o un test
Il programma viene eseguito?NoFino alla riga che fallisceSì, fino alla fine
Messaggio di erroreSì, con un numero di rigaSì, con un tracebackNessuno
Esempio in Pythonif x > 3 senza i due punti10 / 0a + b / 2 per una media
Come lo troviLeggi il messaggioLeggi il tracebackConfronti l'output con una risposta nota

Alcuni libri di testo elencano più tipi, e la maggior parte rientra in questi tre. Un errore di tipo che il compilatore Java rifiuta, come incompatible types: String cannot be converted to int, viene trovato in fase di compilazione come un errore di sintassi, e alcuni libri lo chiamano errore semantico. Un errore del linker avviene nell'ultima fase della costruzione di un programma C o C++, quando una funzione è stata dichiarata ma il suo codice non si trova da nessuna parte. Gli errori aritmetici, di risorse e di file, come dividere per zero, esaurire la memoria o aprire un file che non c'è, sono tutti errori di runtime. Alcuni corsi usano "errore semantico" anche come altro nome dell'errore logico, quindi controlla quale significato usa il tuo libro di testo.

Come trovare un errore logico

  1. Testa con una risposta che conosci già. Calcola a mano il risultato corretto per un input piccolo, poi confronta. Tre voti sono più facili da controllare di tremila.
  2. Stampa i valori intermedi. Stampare score e il ramo scelto, o il contatore del ciclo a ogni passaggio, mostra il passo esatto in cui la realtà si allontana dal tuo piano.
  3. Procedi passo passo con un debugger. Impostare un breakpoint ed eseguire una riga alla volta fa la stessa cosa senza modificare il codice.
  4. Testa i casi limite. Prova 0, 1, il valore più grande, una lista vuota e la soglia esatta (60 e 90 nell'esempio dei voti).
  5. Spiega il codice ad alta voce. Descrivere ogni riga a qualcun altro, o a una paperella di gomma, ti costringe a dire cosa fa davvero la riga invece di cosa pensi che faccia.

Un assert trasforma una risposta nota in un controllo automatico. Non fa niente quando la condizione è vera e ferma il programma quando è falsa:

Traceback (most recent call last):
  File "main.py", line 10, in <module>
    assert grade(95) == "A", "95 should be an A"
           ^^^^^^^^^^^^^^^^
AssertionError: 95 should be an A

Un test che fallisce trasforma un errore logico silenzioso in uno rumoroso con un numero di riga. È tutta qui l'idea dei test unitari.

Errori logici in altri linguaggi

Gli schemi sono gli stessi ovunque, ma ogni linguaggio ha le sue trappole. In JavaScript, "5" + 3 è la stringa "53", mentre "5" - 3 è il numero 2, quindi un valore letto da un modulo come testo può sommarsi in modo sbagliato senza alcun errore. In C, if (x = 5) assegna 5 a x ed è sempre vero. Clang lo segnala con un avviso per impostazione predefinita (using the result of an assignment as a condition without parentheses), ma il codice compila e gira comunque, quindi prendi gli avvisi del compilatore sul serio quanto gli errori.

Cosa leggere dopo

Confronta questa pagina con le pagine sull'errore di sintassi e sull'errore di runtime per vedere come viene segnalato ogni tipo. I cicli sono il posto dove vivono gli errori di uno, quindi la pagina sull'iterazione e la guida Python ai cicli for sono buone letture successive. Per esercitarti a trovare risultati sbagliati con esercizi reali, prova il corso Python.

Domande frequenti

Qual è la differenza tra un errore di sintassi e un errore logico?
Un errore di sintassi viola la grammatica del linguaggio, quindi il programma viene rifiutato prima di essere eseguito e ricevi un messaggio con un numero di riga. Un errore logico rispetta perfettamente la grammatica e arriva fino in fondo, ma il risultato è sbagliato, e non c'è alcun messaggio. Un errore di sintassi lo trovi leggendo il messaggio; un errore logico lo trovi testando l'output.
Cos'è un errore logico in Python?
È codice Python che viene eseguito senza traceback ma dà la risposta sbagliata. Esempi tipici sono range(1, 5) quando volevi da 1 a 5 compreso, a + b / 2 quando volevi (a + b) / 2, e rami if controllati nell'ordine sbagliato. Python non può rilevarli, perché non ha modo di sapere cosa intendevi.
Quali sono i 5 tipi di errori in programmazione?
Un elenco comune di cinque è: errori di sintassi, errori semantici (di tipo), errori del linker, errori di runtime ed errori logici. I primi tre si trovano mentre il programma viene costruito, gli errori di runtime compaiono durante l'esecuzione, e gli errori logici si vedono solo come risultati sbagliati. Molti corsi ne insegnano solo tre: di sintassi, di runtime e logici.
Un errore logico è un bug?
Sì. Un bug è qualsiasi difetto che fa comportare un programma in modo diverso da come si voleva, e gli errori logici sono il tipo più comune. Anche i crash e i messaggi di errore sono bug, ma si annunciano da soli, mentre un errore logico deve essere notato da una persona o da un test.
Perché gli errori logici sono difficili da trovare?
Perché niente li indica. Non c'è un numero di riga né un messaggio, e il risultato sbagliato può sembrare plausibile, come una media di 203 per tre voti che nessuno ricontrolla. Si trovano confrontando l'output con una risposta che conosci già, ed è per questo che i test con risultati noti sono importanti.
Illustrazione dei linguaggi di programmazione di Coddy

Impara a programmare con Coddy

INIZIA