Skip to content

La selezione

La selezione è uno dei costrutti fondamentali della programmazione. Esso permette di inserire un set di istruzioni che sono eseguite solo se la condizione anteposta è soddisfatta. In C il blocco di selezione si inserisce con la parola chiave if:

if (condizione) {
    istr1;
    istr2;
    .
    .
}

Dove la condizione si inserisce tra parentesi tonde e il blocco di istruzioni tra parentesi graffe è eseguito solo se condizione risulta true (vera in C).

Introduzione - Gli operatori logici

Gli operatori logici sono delle operazioni che si possono eseguire a livello logico sui bit. Gli operatori di base sono 3: AND, OR e NOT. I primi due prendono in input due bit e forniscono in output 1 bit. L'ultimo, invece, ha un solo bit in input. Il risultato di un operatore logico in base agli input è indicato dalla sua tabella di verità. Di seguito si mostra il funzionamento di questi operatori:

L'AND rappresenta la “e” in italiano. Questo operatore fornisce in output il risultato di 1 solo quando entrambi gli input valgono 1:

A B Output
0 0 0
0 1 0
1 0 0
1 1 1

Come si può notare dalla tabella di verità, considerando i bit come numeri, il risultato dellà rassomiglia quello di una moltiplicazione. Per questa ragione, l'AND è anche detto prodotto logico.

L'OR rappresenta la “o” in italiano. Questo operatore fornisce in output il risultato di 1 solo quando almeno un input è posto a 1:

A B Output
0 0 0
0 1 1
1 0 1
1 1 1

Come si può notare dalla tabella di verità, considerando i bit come numeri, il risultato dellà rassomiglia quello di una somma, a parte per l'ultima configurazione. Per questa ragione, l'OR è anche detto somma logica.

Il NOT rappresenta la negazione in italiano. Questo operatore fornisce in output il risultato di 1 solo quando l'input vale 0 e di 0 solo quando l'input vale 1. In questo senso, il NOT “nega” l'ingresso:

A Output
0 1
1 0

Parlando di condizioni logiche, 1 e 0 possono essere interpretati come “vero” e “falso”. In questo modo, possiamo interpretare gli input degli operatori logici come condizioni a sé e l'output come il risultato della condizione composta usando AND, OR o NOT. Seguendo questo ragionamento, con AND avremo il risultato di vero solo quando entrambe le condizioni saranno vere e quindi soddisfatte. Con OR avremo il risultato di vero solo quando almeno una delle due condizioni sarà vera, ovvero quando la prima condizione è vera oppure quando la seconda è vera. Infine, con il NOT negheremo la condizione e quindi avremo il risultato di vero solo quando la condizione sarà falsa.

Gli operatori sopraindicati si traducono in C con i seguenti simboli:

  • &&: AND tra due condizioni
  • ||: OR tra due condizioni
  • !: NOT di una condizione

Oltre alle condizioni, è possibile applicare questi operatori anche ai numeri. In questo caso si parla di operatori bit-wise o “bit a bit” perché i numeri a cui sono applicati sono tradotti in binario e ad ogni coppia dei bit composta da un bit del numero A e un bit del numero B, è applicato l'operatore. In C gli operatori bit-wise sono:

  • &: AND bit a bit tra due numeri
  • |: OR bit a bit tra due numeri

L'operatore NOT

L'operatore NOT in C è particolare, in quanto se applicato ad un numero qualsiasi diverso da zero, dà come risultato 0, ovvero false. Quindi, ad esempio, se si fa un test del genere: !a dove a è una variabile che contiene il numero 15, questa operazione darà come risultato false. Allo stesso modo, se si testa la variabile a, essendo a diversa da zero, il risultato della condizione sarà true, indipendentemente dal valore assunto da a.

Condizione

La condizione è un test che solitamente si esegue su una variabile. La condizione può riguardare una singola variabile oppure più variabili insieme (condizione composta). Ad esempio, si può fare un test per vedere se una variabile è positiva, oppure se contiene un determinato valore.

Condizione singola

Si può testare una variabile per vedere se è:

  • maggiore: >
  • minore: <
  • maggiore o uguale: >= (attenzione a scriverli senza spazi)
  • minore o uguale: <=
  • uguale: == (attenzione al doppio uguale)
  • diversa: != (attenzione a scriverla attaccata)

rispetto ad un valore oppure ad un'altra variabile. Ad esempio si può scrivere:

if (a > 0) {

}

O anche:

if (b > a) {
    printf("B e' maggiore di A");
}

Negazione di una condizione

Si può negare una condizione, ovvero applicare l'operatore ! (not in C) alla condizione in modo da rendere true una condizione che risulta false e viceversa. Ad esempio:

if (!(b > a)) {
    //Condizione vera solo se (b > a) risulta false, in quando il ! nega false che diventa 
    //true. Quindi in questo caso il codice è eseguito solo se a è minore di b

}

Condizione composta

Si possono testare anche più variabili contemporaneamente con gli operatori di:

  • &&: and logico (“e” in italiano) che risulta vero solo se tutte le condizioni risultano vere;
  • ||: or logico (“oppure” in italiano) che risulta vero se almeno una condizione è vera.

Il numero di condizioni concatenabili non è definito: se ne possono mettere insieme 2, 3 o anche di più a patto che ogni condizione sia separata dalle altre da && o ||. Ad esempio:

if (a==0 && b == 0) {
    //Condizione true solo se a è uguale a 0 e b è uguale a 0

}
if (a==0 || c >= 0) {
    //Condizione true solo se a è uguale a 0 oppure c è maggiore o uguale a 0. In questo
    //caso basta che una delle due condizioni sia true per rendere la condizione composta 
    //true

}

Ordine di valutazione delle condizioni

Le condizioni sono valutate da sinistra verso destra. Nel caso di utilizzo di soli &&, al raggiungimento della prima condizione false, il controllo delle condizioni si interrompe. È possibile valutare più condizioni insieme usando le parentesi e anche && e || mischiati insieme.

if ((a==0 && b == 0) || (c==0 && d==0)) {
    //Condizione vera se la prima condizione è vera (a è uguale a 0 e b anche) oppure
    //se la seconda condizione è vera (c è uguale a 0 e d anche)

}