- Programmazione » Programmazione » Guida C - Manuale programmazione con articoli e risorse interessanti
Gli operatori
Come tutti i linguaggi di programmazione, il C dispone di un
insieme di operatori, cioè di simboli che
rappresentano particolari operazioni sul valore di un dato
(che viene comunemente detto operando).
Alcuni operatori C sono perfettamente equivalenti a quelli
omologhi di altri linguaggi, altri sono peculiari; tuttavia,
prima di esaminarne le principali caratteristiche, è
bene chiarire il significato di due concetti:
precedenza e associatività .
Quando un operatore agisce su più operandi o in
un'espressione sono definite più operazioni, tali
concetti assumono notevole importanza, perché
consentono di interpretare correttamente l'espressione
stessa, stabilendo quali operazioni devono essere effettuate
prima delle altre. Consideriamo, quale esempio, una
somma:
a = b + c;
Nell'espressione sono presenti due operatori:
l'uguale (operatore di assegnamento) ed il
"più" (operatore di somma). E' facile
comprendere che l'espressione ha significato solo se
viene dapprima calcolata la somma dei valori contenuti in
b e c, e solo successivamente il risultato
è assegnato ad a. Possiamo dire che la
precedenza dell'operatore di assegnamento
è minore di quella dell'operatore di
somma.
Consideriamo ora una serie di assegnamenti:
a = b = c = d;
Il compilatore C la esegue assegnando il valore di d
a c; poi il valore di c a b;
infine, il valore di b ad a. Il risultato
è che il valore di d è assegnato in
cascata alle altre variabili; in pratica, che
l'espressione è stata valutata da destra a
sinistra, cioè che l'operatore di assegnamento
gode di associatività da destra a sinistra.
In altre parole, la precedenza si riferisce all'ordine
in cui il compilatore valuta gli operatori, mentre
l'associatività concerne l'ordine in cui sono
valutati operatori aventi la stessa precedenza (non è
detto che l'ordine sia sempre da destra a
sinistra).
Le parentesi tonde possono essere sempre utilizzate per
definire parti di espressioni da valutare prima degli
operatori che si trovano all'esterno delle parentesi.
Inoltre, quando vi sono parentesi tonde annidate, vale la
regola che la prima parentesi chiusa incontrata si accoppia
con l'ultima aperta e che vengono sempre valutate per
prime le operazioni più interne. Così, ad
esempio, l'espressione
a = 5 * (a + b / (c - 2));
è valutata come segue: dapprima è calcolata la differenza tra c e 2, poi viene effettuata la divisione di b per tale differenza. Il risultato è sommato ad a ed il valore ottenuto è moltiplicato per 5. Il prodotto, infine, è assegnato ad a. In assenza delle parentesi il compilatore avrebbe agito in maniera differente, infatti:
a = 5 * a + b / c - 2;
è valutata sommando il prodotto di a e
5 al quoziente di b diviso per c;
al risultato è sottratto 2 ed il valore
così ottenuto viene assegnato ad a.
Vale la pena di presentare l'insieme degli operatori C,
riassumendone in una tabella le regole di precedenza ed
associatività; gli operatori sono elencati in ordine
di precedenza decrescente.
OPERATORI C
|
Operatore |
Descrizione |
Associatività |
| () | chiamata di funzione |
da sx a dx |
| [] | indici di array | |
| . | appartenenza a struttura | |
| -> | appartenenza a struttura refernziata da puntatore | |
| ! | NOT logico |
da dx a sx |
| ~ | complemento a uno | |
| - | meno unario (negazione) | |
| ++ | autoincremento | |
| -- | autodecremento | |
| & | indirizzo di | |
| * | indirezione | |
| (tipo) | cast (conversione di tipo) | |
| sizeof() | dimensione di | |
| * | moltiplicazione |
da sx a dx |
| / | divisione | |
| % | resto di divisione intera | |
| + | addizione |
da sx a dx |
| - | sottrazione | |
| << | scorrimento a sinistra di bit |
da sx a dx |
| >> | scorrimento a destra di bit | |
| < | minore di |
da sx a dx |
| <= | minore o uguale a | |
| > | maggiore di | |
| >= | maggiore o uguale a | |
| == | uguale a |
da sx a dx |
| != | diverso da (NOT uguale a) | |
| & | AND su bit |
da sx a dx |
| ^ | XOR su bit |
da sx a dx |
| | | OR su bit |
da sx a dx |
| && | AND logico |
da sx a dx |
| || | OR logico |
da sx a dx |
| ? : | espressione condizionale |
da dx a sx |
| =, etc. | operatori di assegnamento (semplice e composti) |
da dx a sx |
| , | virgola (separatore di espressioni) |
da sx a dx |
Come si vede, alcuni operatori possono assumere significati diversi. Il loro modo di agire sugli operandi è quindi talvolta desumibile senza ambiguità solo conoscendo il contesto di azione, cioè le specifiche espressioni in cui sono utilizzati. Di seguito è fornita una descrizione dettagliata degli operatori di cui ancora non si è detto in precedenza, elencati in ordine di precedenza decrescente, come da tabella, ma, al tempo stesso, raggruppati per analogia di significato.