Corso di C con Linux

Operatori matematici, relazionali e logici.

 

Con la lezione di oggi cominciamo a vedere in che modo è possibile lavorare sui tipi di dati fondamentali visti nelle lezioni precedenti.
Abbiamo già visto che l'assegnamento in C viene effettuato utilizzando il simbolo "=" (uguale), ad es.:
int x = 0; Oltre agli operatori aritmetici standard:

+ (somma)
- (sottrazione)
* (moltiplicazione)
/ (divisione)


esiste l'operatore % (modulo) per gli interi, che ritorna il resto di una divisione intera.
Ecco un semplice es. che riassume l'utilizzo di questi operatori per gli interi:

int x = 10;
int y = 3;
int h, j, k, u, v;
h = x + y; /* h contiene il valore 13 */
j = x - y; /* j contiene il valore 7  */
k = x * y; /* k contiene il valore 30 */
u = x / y; /* u contiene il valore 3  */
v = x % y; /* v contiene il valore 1
  */


Per gli interi il C offre anche gli operatori di incremento (++) e decremento (--), che possono essere preposti o posposti alla variabile.
Se sono preposti il valore incrementato o decrementato è calcolato prima che l'espessione sia valutata, se sono posposti il valore viene calcolato dopo la valutazione dell'espressione, ad es.:

int x, z=2;
es. 1)
x = (++z)-1; /* Prima viene incrementato z al valore 3 e poi viene assegnato a x il valore 3-1=2 */
es. 2)
x = (z++)-1; /* Prima viene assegnato a x il valore 2-1=1 e poi incrementato z al valore 3 */

Ecco un ulteriore esempio:
int x, y, w;
x=((++y) - (w--)) % 10;
che equivale alle seguenti istruzioni:
int x, y, w;
y++;
x = (y - w) % 10;
w--;


È importante sottolineare che un'istruzione del tipo x++ è più veloce della corrispondente x = x+1. L'operatore "%" (modulo) può essere utilizzato solamente con le variabili di tipo integer; la divisione "/" è utilizzata sia per gli integer che per i float. A proposito della divisione riportiamo un altro esempio:
f = 5/2;
in cui f assumerà il valore 1, anche se è stato dichiarato come float. Infatti, di regola, se entrambi gli argomenti della divisione sono integer, allora verrà effettuata una divisione intera. Per avere un risultato di tipo float è necessario scrivere:
f = 5.0/2;
oppure:
f = 5/2.0;
oppure ancora:
f = 5.0/2.0;

In questo modo f assumerà il valore 2.5. Esiste, inoltre, una forma contratta per espressioni del tipo:
expr1 = expr1 op expr2
dove op è un operatore.

Infatti, queste espressioni possono scriversi nella forma:
expr1 op= expr2
Ad es.:
x = x+5;
può essere scritta in forma contratta:
x += 5;
e ancora:
x = x * (y+7);
può diventare:
x *= y+7;

E' importante notare che l'espressione x *= y+3 corrisponde a x = x*(y+7) e non a x = (x*y)+7.
Gli operatori relazionali o di confronto vengono utilizzati per testare delle condizioni di uguaglianza e disuguaglianza e sono utilizzati spesso nei programmi.
Per testare l'uguaglianza si usa:

==
per la disuguaglianza:
>!=
Vi sono poi gli operatori:
< (minore)
> (maggiore)
<= (minore o uguale)
>= (maggiore o uguale)



Gli operatori relazionali hanno una precedenza inferiore agli operatori aritmetici, perciò un'espressione del tipo:

i <= lim-1
viene interpretata come:
i <= (lim-1)

Occorre fare molta attenzione all'utilizzo del test di uguaglianza, perché spesso avviene che ci si dimentica di mettere il secondo segno di uguale, col risultato che invece di testare una condizione si esegue un assegnamento (vedremo meglio questo possibile errore nella prossima lezione).
Infine vediamo gli operatori logici, che sono due:

&& (AND)
|| (OR)

Le espessioni connesse da && e || vengono valutate da sinistra a destra e la valutazione si blocca non appena si determina la verità o la falsità dell'intera espressione.
Come vedremo in seguito questa proprietà risulta molto utile per evitare certi errori durante l'esecuzione dei programmi, come divisioni per zero o superamento dei limiti di un array.
Nella prossima lezione vedremo come utilizzare alcuni di questi operatori per controllare il flusso di esecuzione dei nostri programmi.

 

Torna all'indice Generale del corso di Corso di C con Linux di Software Planet