1. Sintassi di base di un if annidato
Nella vita reale è raro trovarsi in una situazione in cui una decisione si prende in base a un solo criterio. Di solito bisogna verificare più condizioni contemporaneamente, e spesso dipendono l’una dall’altra. Per esempio, per entrare a un concerto non basta essere maggiorenni — a volte bisogna anche essere nella lista degli invitati. Qui entra in scena la cosiddetta logica multilivello, e ci aiutano in questo gli operatori if annidati.
Le condizioni annidate sono quando un if vive dentro un altro. Immagina una scatola dentro la scatola: se la condizione esterna è soddisfatta, solo allora viene verificata quella interna. È un potente strumento di controllo del flusso.
Cominciamo da qualcosa di semplice:
if (uslovieA)
{
// azioni se uslovieA è true (vero)
if (uslovieB)
{
// azioni se entrambe le condizioni sono vere
}
}
if
Se ti ricorda una matrioska — stai capendo bene! L’if interno verrà eseguito solo se quello esterno è scattato.
Esempio: ingresso al club
Sviluppiamo la nostra app didattica, dove l’utente in precedenza inseriva nome ed età. Ora aggiungiamo un secondo livello di verifica: supponiamo che, per entrare in un club privato, bisogna avere più di 21 anni e disporre di un codice di invito.
System.out.print("Inserisci il tuo nome: ");
String name = console.nextLine();
System.out.print("Inserisci la tua età: ");
int age = console.nextInt();
if (age >= 21)
{
System.out.print("Inserisci il codice di invito: ");
String code = console.nextLine();
if (code.equals("VIP2024"))
{
System.out.println("Benvenuto, " + name + ", nel club VIP!");
}
else
{
System.out.println("Spiacenti, codice non valido. Accesso negato.");
}
}
else
{
System.out.println("Spiacenti, ingresso consentito solo dai 21 anni!");
}
Attenzione: l’if interno controlla il codice solo se l’età ha già superato il controllo. Questo fa risparmiare risorse (e i nervi del buttafuori).
2. Quanti livelli di annidamento sono accettabili?
Tecnicamente — quanti vuoi. Ma in pratica: più livelli annidati ci sono, più è difficile leggere e mantenere il codice. Di solito ci si limita a 2–3 livelli. Se ti ritrovi con una “scaletta” di 4+ if annidati, valuta se puoi semplificare la logica o estrarre i controlli in metodi.
3. if ed else annidati: trappole e sfumature
Errore tipico dei principianti: uso disattento delle parentesi graffe.
In Java con else vige una regola rigida: senza parentesi graffe {} all’if o all’else è associata solo la prima istruzione successiva. È una fonte frequente di fastidiosi bug.
Esempio con potenziale errore:
if (age >= 21)
if (code.equals("VIP2024"))
System.out.println("Benvenuto!");
else
System.out.println("Codice non valido.");
Molti si aspettano che l’else si riferisca al controllo dell’età, ma in realtà si riferisce all’if più vicino precedente (il controllo del codice di invito). Perciò i messaggi possono essere mostrati in modo diverso da quanto previsto. Meglio usare sempre le parentesi — anche se dentro c’è solo una riga!
Per evitare ambiguità, il compilatore vede questo codice così:
if (age >= 21)
{
if (code.equals("VIP2024"))
System.out.println("Benvenuto!");
else
System.out.println("Codice non valido.");
}
Importante! Ancora una volta: se nella costruzione if-else non metti le parentesi graffe, l’else si riferisce all’if precedente (il più vicino).
4. Alternative: else if in condizioni annidate
A volte, dentro l’if esterno, non vuoi solo verificare una condizione aggiuntiva, ma anche prevedere un’alternativa. Per esempio, se il codice di invito non va bene, puoi offrire un accesso ospite oppure rifiutare.
if (age >= 21)
{
System.out.print("Inserisci il codice di invito: ");
String code = console.nextLine();
if (code.equals("VIP2024"))
{
System.out.println("Benvenuto nel club!");
}
else if (code.equals("GUEST"))
{
System.out.println("Modalità ospite: accesso consentito solo fino alle 23:00.");
}
else
{
System.out.println("Purtroppo, l'accesso non è possibile.");
}
}
else
{
System.out.println("Ingresso consentito solo dai 21 anni.");
}
Qui, all’interno della scelta esterna, facciamo una scelta annidata tra tre scenari: codice VIP, codice ospite e rifiuto.
5. Pratica: calcolatore di sconto con logica multilivello
Supponiamo che all’utente venga applicato uno sconto in base all’età e alla presenza di una tessera del club.
- Se l’età dell’utente è maggiore o uguale a 60 — sconto del 15 %.
- Se l’età è inferiore ma l’utente ha una tessera del club — sconto del 7 %.
- Negli altri casi, nessuno sconto.
Come implementarlo?
System.out.print("Inserisci la tua età: ");
int age = console.nextInt();
double discount = 0.0;
if (age >= 60)
{
discount = 0.15;
}
else
{
System.out.print("Hai una tessera del club (sì/no)? ");
String hasCard = console.nextLine();
if (hasCard.equals("sì"))
{
discount = 0.07;
}
}
System.out.println("Il tuo sconto: " + (discount * 100) + "%");
Qui abbiamo usato un if annidato nel ramo else: se l’età non soddisfa il requisito, solo allora chiediamo della tessera.
GO TO FULL VERSION