Fondamenti di Informatica - Linguaggio C - Espressioni e operatori
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 1
FONDAMENTI DI INFORMATICA
Prof. PIER LUCA MONTESSORO Ing.DAVIDE PIERATTONI
Facoltà di Ingegneria Università degli Studi di Udine
Linguaggio C Espressioni e operatori
Fondamenti di Informatica - Linguaggio C - Espressioni e operatori
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 2 Questo insieme d i trasparenze ( detto nel seguito slide) è protetto dalle leggi sul copyright e dalle disposizioni dei trattati internazionali. Il titolo ed i copyright relativi alle slides (ivi inclusi , ma non limitatamente, ogni immagine, fotografia, animazione , video, audio, musica e testo) sono d i proprietà degli autori prof . Pier Luca Montessoro e ing. Davide Pierattoni, Università degli Studi di Udine.
Le slide possono essere riprodotte ed utilizzate liberamente dagli istituti di ricerca , scolastici ed universitari afferenti a l Ministero della Pubblica Istruzione e al Ministero dell’Università e Ricerca Scientifica e Tecnologica , per scopi istituzionali, non a fine di lucro . In tal caso non è richiesta alcuna autorizzazione .
Ogni altro utilizzo o riproduzione (ivi incluse , ma non limitatamente, le riproduzioni su supporti magnetici , su reti d i calcolatori e stampe) in toto o in parte è vietata, se non esplicitamente autorizzata per iscritto, a priori, da parte degli autori.
L’informazione contenuta in queste slide è ritenuta essere accurata alla data della pubblicazione . Essa è fornita per scopi meramente didattici e non per essere utilizzata in progetti d i impianti, prodotti, reti, ecc. In ogni caso essa è soggetta a cambiamenti senza preavviso. Gli autori non assumono alcuna responsabilità per il contenuto d i queste slide (ivi incluse, ma non limitatamente , la correttezza, completezza, applicabilità, aggiornamento dell’informazione ).
In ogni caso non può essere dichiarata conformità all’informazione contenuta in queste slide.
In ogni caso questa nota di copyright e il suo richiamo in calce ad ogni slide non devono mai essere rimossi e devono essere riportati anche in utilizzi parziali.
Nota di Copyright
Fondamenti di Informatica - Linguaggio C - Espressioni e operatori
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 3
Operatori ed espressioni
• I programmi hanno lo scopo di eseguire operazioni sui dati
• Il linguaggio C offre una serie di operatori:
– aritmetici – relazionali – logici
– di assegnazione
– di incremento e decremento – bit a bit (“bitwise”)
Gli operatori che richiedono due operandi si dicono binari; alcuni operatori, detti unari, agiscono invece su un unico operando
Fondamenti di Informatica - Linguaggio C - Espressioni e operatori
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 4
Espressioni
• Un’espressione è una combinazione di operatori e relativi operandi
• Nella forma più semplice, un’espressione è priva di operatori; in tal caso corrisponde a:
3.14 ê una costante x ê il valore di una variabile calcola_valore(x, y)
ê una funzione definita dall’utente sin(x) ê una funzione di libreria
Fondamenti di Informatica - Linguaggio C - Espressioni e operatori
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 5
Espressioni
• Nella sua forma più complessa, un’espressione può comprendere uno o più operatori e relativi operandi
(2+i) * (2-i)
• Se nell’espressione compaiono più operatori, questi sono soggetti a delle precise regole di precedenza
• L’espressione aritmetica precedente corrisponde ad esempio al prodotto tra le due espressioni (2+i) e (2-i), mentre:
2+i*2-i corrisponde a (2+(i*2)) - i
Fondamenti di Informatica - Linguaggio C - Espressioni e operatori
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 6
Operatori aritmetici
• Gli operatori aritmetici disponibili in C sono:
+ somma - sottrazione
* moltiplicazione / divisione
% modulo (resto della divisione intera)
• L’operatore di divisione applicato a due interi restituisce la parte intera del quoziente (es. 5/2 ê 2)
• L’operatore % fornisce il resto della divisione tra due operandi interi: 5%2 ê 1
• Nel caso di operandi reali: 5.0/2.0 ê 2.5 (se un operando è reale e l’altro intero, quello intero viene “promosso” a reale)
Fondamenti di Informatica - Linguaggio C - Espressioni e operatori
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 7
Operatori aritmetici
• Sono possibili più operazioni in sequenza
• In tale caso:
ä *, / e % hanno la precedenza su + e - ä l’associatività vale da sinistra verso destra
Quindi 6 + 3 * 4 / 3 + 2 corrisponde a...
(6 + ((3*4)/3)) + 2 é 12é
Fondamenti di Informatica - Linguaggio C - Espressioni e operatori
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 8
Operatore cast
• In qualsiasi espressione è possibile forzare delle conversioni di tipo, mediante l’operazione unaria di cast
• Nel costrutto generico
(nome_del_tipo) espressione l’espressione viene convertita nel tipo specificato, secondo precise regole di corrispondenza tra i tipi
• Ad esempio, se j è un intero, l’espressione (4 /(float) j)
converte “al volo” il valore della variabile j in reale e quindi forza l’esecuzione della divisione tra numeri reali
• Il linguaggio applica delle regole di conversione automatica; è tuttavia consigliabile indicare
esplicitamente tutte le conversioni di cui non si è certi!
Fondamenti di Informatica - Linguaggio C - Espressioni e operatori
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 9
Operatori aritmetici unari
• Gli operatori aritmetici + e - possono essere utilizzati anche come operatori unari:
-i +i a + (-x) -(2*y) + x
Fondamenti di Informatica - Linguaggio C - Espressioni e operatori
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 10
Operatori relazionali
• Permettono il confronto di coppie di valori tra loro omogenei (dello stesso tipo)
• Generano un risultato logico (vero o falso)
• Sono spesso usati come condizioni di controllo dell’esecuzione di un programma
• Essi sono:
> maggiore
>= maggiore o uguale
< minore
<= minore o uguale
== uguale
!= diverso
Fondamenti di Informatica - Linguaggio C - Espressioni e operatori
Vero e falso
• In C un’espressione è:
– VERA se assume un valore diverso da zero
– FALSA se assume il valore zero
NOTA: normalmente non è necessario che il
0 = falso ≠ 0 = vero
Fondamenti di Informatica - Linguaggio C - Espressioni e operatori
Esempi di espressioni relazionali
• Il risultato di un’espressione relazionale è un valore logico vero o falso
• Se i = 5 e j = 7, allora:
i > j i < j i >= j i <= j i == j i != j
é è falsa
é è falsa é è vera é è falsa é è vera é è vera
Fondamenti di Informatica - Linguaggio C - Espressioni e operatori
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 13
Esempi di espressioni relazionali
• Gli operatori relazionali hanno precedenza inferiore rispetto agli operatori aritmetici, e associatività da sinistra verso destra
var_1 == var_2 + 1
ê corrisponde all’espressione var_1==( var_2 + 1)
a + b != i
ê corrisponde a (a+b) != i
Fondamenti di Informatica - Linguaggio C - Espressioni e operatori
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 14
Operatori logici
• A questa categoria appartengono gli operatori booleani:
&& AND logico
|| OR logico
! NOT logico (unario)
• Gli operatori && e || hanno precedenza inferiore agli operatori aritmetici e agli operatori relazionali;
l’associatività vale da sinistra a destra
• L’operatore && ha precedenza maggiore rispetto a ||
• L’operatore ! ha precedenza maggiore rispetto agli operatori aritmetici, relazionali, all’ AND e all’OR logici;
per esso l’associatività vale da destra a sinistra
Fondamenti di Informatica - Linguaggio C - Espressioni e operatori
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 15
Operatori logici: AND
A B U
F F F
F V F
V F F
V V V
U = A && B
Fondamenti di Informatica - Linguaggio C - Espressioni e operatori
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 16
Operatori logici: AND
A && B è falsa se almeno un operando è falso A && B è vera se tutti gli
operandi sono veri
Fondamenti di Informatica - Linguaggio C - Espressioni e operatori
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 17
Operatori logici: OR
A B U
F F F
F V V
V F V
V V V
U = A || B
Fondamenti di Informatica - Linguaggio C - Espressioni e operatori
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 18
Operatori logici: OR
A || B è falsa se tutti gli operandi sono falsi A || B è vera se almeno un
operando è vero
Fondamenti di Informatica - Linguaggio C - Espressioni e operatori
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 19
Operatori logici: NOT
A U
F V
V F
U = !A
Fondamenti di Informatica - Linguaggio C - Espressioni e operatori
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 20
Operatori logici
• L’operatore ! di negazione logica restituisce:
un valore diverso da zero, quando l’operando vale 0 (nel caso di un intero) oppure 0.0 (nel caso di un floating-point)
zero, se l’operando ha valore diverso da zero
• È frequente trovare l’operatore ! in espressioni condizionali del tipo:
if (!espressione) istruzioni
nel qual caso il blocco di istruzioni verrà eseguito solo l’espressione è falsa
Fondamenti di Informatica - Linguaggio C - Espressioni e operatori
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 21
Operatori di assegnazione
• La sintassi dell’operatore di assegnazione è:
nome_variabile = espressione Alla variabile a sinistra dell’operatore '=' viene assegnato il risultato o il valore dell’espressione a destra
• Esempi:
z = 2 * y - 1;
x = z - 3;
assegno a z il valore 2*y - 1...
…e poi assegno a x il valore z - 3 Un’assegnazione è di per sé un’espressione con un proprio risultato, e quindi le istruzioni precedenti equivalgono a scrivere:
x = (z = 2*y -1) - 3;
Fondamenti di Informatica - Linguaggio C - Espressioni e operatori
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 22
Operatori di assegnazione
• Un caso particolare è l’assegnazione multipla, che permette di assegnare lo stesso valore a più variabili contemporaneamente:
var_1 = var_2 = … = var_n = espressione;
• Ad esempio, l’istruzione:
i = j = k * 2 - 1;
equivale a scrivere:
j = k * 2 - 1;
i = j;
Fondamenti di Informatica - Linguaggio C - Espressioni e operatori
Operatori compatti di assegnazione
• La forma sintattica compatta:
nome_var operatore= espressione equivale a scrivere:
nome_var = nome_var operatore espressione dove operatore è uno dei seguenti:
+ - / * % << >> & ^ |
• Ad esempio:
x *= y + 1;
y += 5;
x = x * (y + 1);
y = y + 5;
Fondamenti di Informatica - Linguaggio C - Espressioni e operatori
Operatori di assegnazione
• Gli operatori di assegnazione hanno priorità inferiore a tutti gli operatori del C, eccetto l’operatore virgola
• L’associatività vale inoltre da destra verso sinistra, contrariamente agli operatori aritmetici e logici
• Esempi:
y = x /= z += !j - 5;
equivale a... y = (x /= (z += ((!j) - 5)));
oppure a: z = z + ((!j) - 5);
x = x / z;
Fondamenti di Informatica - Linguaggio C - Espressioni e operatori
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 25
Operatori di incremento e decremento
• In C esistono due operatori unari “speciali”:
++ incremento di uno (“autoincrement”) -- decremento di uno (“autodecrement”)
• Essi permettono di incrementare o decrementare di un’unità la variabile cui sono applicati
• Si possono applicare in due modalità:
è prefissa (es. ++i): la variabile viene modificata prima di utilizzarne il valore
è postfissa (es. k--): la variabile viene modificata dopo averne utilizzato il valore
Fondamenti di Informatica - Linguaggio C - Espressioni e operatori
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 26
Operatori di incremento e decremento
• Il vantaggio di impiegare gli operatori ++ e -- risiede nel fatto di ridurre il numero di espressioni nel codice
• Ad esempio, l’istruzione:
j = 2 * (++i); corrisponde a…
mentre:
j = 2 * (i++); equivale a...
i = i + 1;
j = 2 * i;
j = 2 * i;
i = i + 1;
Fondamenti di Informatica - Linguaggio C - Espressioni e operatori
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 27
Operatori di incremento e decremento
• ATTENZIONE:
i = i++; è indefinita !!!
j = 3/i - 2*(--i); è indefinita !!!
Infatti, il linguaggio non specifica quando viene effettuato l’autoincremento o l’autodecremento rispetto alla valutazione degli altri elementi dell’istruzione.
Fondamenti di Informatica - Linguaggio C - Espressioni e operatori
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 28
Operatori bit a bit (o bitwise)
• Il linguaggio C definisce sei operatori che manipolano i bit
• Gli operatori logici sui bit sono:
~ operatore (unario) di complemento
& operatore AND
^ operatore OR esclusivo
| operatore OR
• Esistono anche due operatori di traslazione sui bit:
<< traslazione (shift) a sinistra
>> traslazione (shift) a destra
Fondamenti di Informatica - Linguaggio C - Espressioni e operatori
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 29
Operatori logici: EXOR (or esclusivo)
A B U
0 0 0
0 1 1
1 0 1
1 1 0
U = A ^ B
Fondamenti di Informatica - Linguaggio C - Espressioni e operatori
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 30
Operatori logici: EXOR
A ^ B vale 0 se gli operandi sono entrambi 0
oppure entrambi 1 A ^ B vale 1 se gli operandi hanno valori
logici differenti
Fondamenti di Informatica - Linguaggio C - Espressioni e operatori
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 31
Operatori bit a bit
• Poiché il modo in cui viene gestito il bit di segno dipende dal compilatore, è meglio applicare tali operatori a variabili di tipo unsigned
• L’operatore ~effettua il complemento a uno dell’operando. Se x è rappresentato da:
1 0 1 1 0 0 1 0 1 0 0 1 1 1 0 0 allora ~x sarà rappresentato da...
0 1 0 0 1 1 0 1 0 1 1 0 0 0 1 1
Fondamenti di Informatica - Linguaggio C - Espressioni e operatori
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 32
Operatori bit a bit
• L’operatore & confronta due operandi effettuandone l’AND logico bit a bit. Se x è rappresentato da
0 0 1 1 1 1 1 1 0 1 0 1 0 0 1 0 mentre y è rappresentato da:
1 0 0 1 1 0 1 1 0 1 1 0 0 1 1 1 allora il risultato dell’espressione x & y sarà...
0 0 0 1 1 0 1 1 0 1 0 0 0 0 1 0
Fondamenti di Informatica - Linguaggio C - Espressioni e operatori
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 33
Operatori bit a bit
• L’operatore ^ effettua l’OR esclusivo (XOR) bit a bit tra due operandi
• Se la variabile x è rappresentata da:
1 1 1 0 1 0 0 0 1 1 0 1 0 0 0 1 mentre la variabile y è data da:
0 1 0 1 1 0 0 1 0 0 0 1 0 0 1 1 il risultato di x ^ y sarà...
1 0 1 1 0 0 0 1 1 1 0 0 0 0 1 0
Fondamenti di Informatica - Linguaggio C - Espressioni e operatori
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 34
Operatori bit a bit
• L’operatore | effettua l’OR bit a bit
• Se la variabile x è rappresentata da:
0 0 1 0 1 1 0 0 1 1 0 1 0 0 1 1 mentre y è data da:
1 1 1 0 1 1 1 1 0 0 0 0 1 0 0 1 allora il risultato di x | y sarà...
1 1 1 0 1 1 1 1 1 1 0 1 1 0 1 1
Fondamenti di Informatica - Linguaggio C - Espressioni e operatori
Operatori bit a bit
• Gli operatori di traslazione (o di shift) << e >>
spostano il loro operando sinistro di un numero di bit pari al valore dell’operando destro
• Ad esempio
x << 4;
sposta a sinistra di quattro posizioni il valore di x, e riempie di zeri i bit così liberati
• In termini di numeri binari, se x è dato da:
0 0 1 0 1 1 1 0 1 0 1 1 0 1 1 1 allora il risultato di x << 4 sarà...
Fondamenti di Informatica - Linguaggio C - Espressioni e operatori
Operatori bit a bit
• In modo analogo, lo shift a destra viene effettuato dall’operatore >>
• In tale caso, però, il riempimento dei bit liberati dipende dal tipo dell’operando:
– se l’operando è unsigned, i bit liberati sono posti a 0 – se l’operando è signed, su alcuni sistemi i bit liberati vengono posti uguali al bit di segno, su altri messi a 0
• Ad esempio, se x è di tipo unsigned char (8 bit) e vale B8h:
1 0 1 1 1 0 0 0 allora il risultato di x >> 3 sarà...
Fondamenti di Informatica - Linguaggio C - Espressioni e operatori
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 37
Espressioni condizionali
• Le espressioni condizionali fanno uso dell’operatore ternario ?:
• La sintassi di un’espressione condizionale è:
espressione_1 ? espressione_2 : espressione_3
• Dapprima viene valutata l’espressione_1; se essa risulta vera (ossia ha valore non nullo), allora viene valutata l’espressione_2, il cui valore diventa il risultato dell’espressione condizionale
• In caso contrario, viene valutata l’espressione_3, il cui valore diventa il risultato dell’intero costrutto
Fondamenti di Informatica - Linguaggio C - Espressioni e operatori
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 38
Espressioni condizionali
• Ad esempio, le istruzioni if (a > b)
z = a;
else z = b;
• possono essere tradotte nel costrutto z = (a > b) ? a : b ;
• Si noti che, se n è un int ed f un float, l’espressione:
(n > 0) ? f : n
restituisce un valore float, indipendentemente dal fatto che n sia positivo o meno (promozione di tipo)
Fondamenti di Informatica - Linguaggio C - Espressioni e operatori
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 39
Precedenza degli operatori
• La seguente tabella riassume le regole di precedenza e associatività di tutti gli operatori del linguaggio C
• Gli operatori sulla stessa linea hanno la stessa precedenza
• Le righe sono in ordine di precedenza decrescente
• Si osserva che gli operatori unari + e - hanno precedenza maggiore delle rispettive forme binarie
• Nella seconda riga compaiono anche l’operatore di deriferimento * , quello di indirizzo & e quello di membro di una struttura (l’operatore punto “.” ) Questi non vanno confusi con gli omonimi operatori logici o aritmetici!
Fondamenti di Informatica - Linguaggio C - Espressioni e operatori
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 40
Precedenza degli operatori
operatori () [] -> .
! - + ++ -- * & ( tipo ) sizeof
* / % + -
<< >>
< <= > >=
&
^
|
&&
||
?:
= += -= /= *= %= &= ^= |= <<= >>=
, (virgola )
== !=
associatività da sinistra a destra da destra a sinistra da sinistra a destra da sinistra a destra da sinistra a destra da sinistra a destra
da sinistra a destra da sinistra a destra da sinistra a destra da sinistra a destra da sinistra a destra da destra a sinistra da destra a sinistra da sinistra a destra da sinistra a destra