C Tutorial

Tutorial Programmazione C – Approfondimento Operatori

Buongiorno a tutti,

in questo articolo approfondiamo l’argomento Operatori cercando di trattare l’argomento in maniera completa ed esaustiva.

Possiamo considerare un operatore come un’istruzione del linguaggio di programmazione, che lavora sulle variabili, o più in generale sui dati e ci restituisce un valore. Ci sono però parecchi operandi ed ognuno si comporta in maniera differente.
Affrontiamo gli operatori per categoria, cominciando da quelli più semplici, cioè quelli aritmetici

Operatori Matematici
Si tratta dei semplici operatori utilizzati nell’aritmetica.


somma = a + b;
sottrazione = a - b;
moltiplicazione = a * b;
divisione = a / b;
modulo = a % b;

Credo il significato dei vari operatori sia più che chiaro, ad eccezione solamente dell’operatore modulo (‘%’) il quale ci restituisce il resto della divisione tra numeri interi.
Un’ulteriore precisazione è doverosa per quanto concerne la divisione tra numeri interi, in C, infatti, la divisione tra numeri interi da sempre un risultato troncato, vale a dire arrotondato SEMPRE per difetto, eliminando semplicemente la parte decimale.

Sono considerabili operatori aritmetici anche gli operatori di incremento e decremento:


a++;//incremento
a--;//decremento

Questi operatori sono detti operatori unari, in quanto lavorano su un solo operando, aumentandone o decrementandone il valore di 1.

Gli operatori di incremento e decremento possono essere usati in due modi, posti prima dell’operando oppure dopo. Quando li si utilizza solamente allo scopo di modificare il valore dell’operando non c’è alcuna differenza nell’ordine in cui vengono utilizzati:
a++ e ++a portano alle medesime conseguenze, incrementare il valore della variabile.
La differenza emerge solamente quando si utilizzano questi operatori in combinazione con un operatore di assegnazione, ad esempio:

risultato = a++;
risultato = ++a;

la differenza sta nell’ordine in cui vengono eseguite le operazioni, nel primo caso, quello in cui l’operatore è posto dopo la variabile, viene immagazzinato all’interno della variabile risultato il valore di a e in seguito il valore di a viene aumentato di 1; quindi dopo che la riga di codice è stata eseguite risultato assume il vecchio valore di a, ed a sarà uguale a risultato + 1.
Nel secondo caso invece viene prima incrementato il valore di a ed in seguito copiato questo valore all’interno della variabile risultato, di conseguenza, una volta eseguita la riga di codice, le due variabili avranno lo stesso valore.

Fanno sempre parte degli operatori matematici gli operatori detti bitwise, che lavorano direttamente sui bit che rappresentano il valore contenuto nella variabile, una spiegazione approfondita della rappresentazione delle varie in codice binario va oltre gli scopi di questo articolo, vi consiglio questo articolo se volete approfondire.

Gli operatori bitwise sono i seguenti:

a = ~a complementa tutti i bit
a = b << c sposta i bits di b a sinistra per un numero di bits pari a c a = b >> c sposta i bits di b a destra per un numero di bits pari a c
a = b & c b AND c
a = b ^ c b XOR c
a = b | c b OR c

Infine C permette di utilizzare delle scorciatoie nei casi in cui si vuole assegnare ad una variabile il valore restituito da un’operazione tra quella stessa variabile ed un’altra (o un letterale). Un esempio chiarirà senz’altro meglio il concetto.

Supponiamo che io voglia prendere il valore di a, sommare a questo valore il valore di b e memorizzare il risultato all’interno della variabile a. La forma completa di questa operazione sarebbe la seguente:


a = a + b;

C mi permette di ottenere lo stesso risultato attraverso la seguente scorciatoia:


a += b;

Di seguito l’elenco completo delle scorciatoie


a = a + b a += b
a = a - b a -= b
a = a * b a *= b
a = a / b a /= b
a = a % b a %= b
a = a << b a <<= b a = a >> b a >>= b
a = a & b a &= b
a = a ^ b a ^= b
a = a | b a |= b

Operatori Relazionali
Gli operatori relazionali vengono utilizzati per confrontare il valore di due variabili e restituiscono un valore di tipo booleano, cioè vero o falso, rappresentati in C dai valori 1 e 0.

a == b uguale
a != b diverso
a < b minore a > b maggiore
a <= b minore o uguale a >= b maggiore o uguale

Tra gli operatori relazionali si annovera anche il criptico operatore ternario, che includo in questo articolo per completezza, ma il cui uso sconsiglio in quanto poco chiaro e di conseguenza rende il codice poco leggibile.

risultato = (x > 5) ? a : b;

Come funziona? come un costrutto if-else: se x > 5 all’interno della variabile ‘risultato’ sarà immagazzinato il valore di a, in caso contrario il valore di b.

Operatori logici
Gli operatori della logica vengono utilizzati per costruire espressioni abbinando più operazioni relazionali. Esistono, in C, tre operatori logici:


! NOT
&& AND
|| OR

come funzionano?
NOT inverte il valore restituito dall’operazione relazionale, ad esempio !(a>b) restituirà vero se a non è maggiore di b e falso in caso contrario.
AND collega due operazioni relazionali e restituisce vero solamente se entrambe risultano vere, falso in caso contrario, ad esempio (a > b) && (a < c) restituisce vero solamente se a è allo stesso tempo maggiore di b e minore di c, falso in tutti gli altri casi. OR collega due operazioni relazionali e restiuisce vero se almeno una delle due risulta vera, restituisce quindi falso solamente se entrambe sono false, ad esempio (a>b) && (aOperatore sizeof()
L’operatore sizeof() è un operatore molto particolare, gli si può dare come argomento un tipo di dato oppure il nome di una variabile e l’operatore ci restituisce un numero intero che indica il numero di byte che la variabile o quel tipo di dato occupa in memoria.

Ti piaciono i miei tutorial e progetti? Aiutami a realizzarne altri. Supporta Zamein's projects su Patreon!

Leave a comment

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *