|
Appunti informatica |
|
Visite: 1476 | Gradito: | [ Picolo appunti ] |
Leggi anche appunti:Problemi di mutua esclusione nel modello a memoria comuneProblemi di mutua esclusione nel modello a memoria comune VI) Scrivere una I device driverI device driver Sempre più difficile: dopo avere affrontato i TSR (pag. 169) Impiego del costrutto monitorImpiego del costrutto monitor XII) Scrivere una applicazione |
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 , poi viene effettuata la divisione di b per tale differenza. Il risultato è sommato ad a ed il valore ottenuto è moltiplicato per . 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 al quoziente di b diviso per c; al risultato è sottratto 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. Circa l'operatore di chiamata a funzione si veda pag.
Appunti su: |
|