Linguaggio C Espressioni e operatori

Transcript

Linguaggio C Espressioni e operatori
Fondamenti di Informatica - Linguaggio C - Espressioni e operatori
FONDAMENTI DI INFORMATICA
Prof. PIER LUCA MONTESSORO
Ing.DAVIDE PIERATTONI
Facoltà di Ingegneria
Università degli Studi di Udine
Linguaggio C
Espressioni e operatori
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2)
1
Fondamenti di Informatica - Linguaggio C - Espressioni e operatori
Nota di Copyright
Questo insieme di 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 di 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 al 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 di 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 di impianti, prodotti, reti, ecc. In ogni caso essa è soggetta a cambiamenti senza
preavviso. Gli autori non assumono alcuna responsabilità per il contenuto di 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.
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2)
2
Fondamenti di Informatica - Linguaggio C - Espressioni e operatori
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
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2)
3
Fondamenti di Informatica - Linguaggio C - Espressioni e operatori
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
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2)
4
Fondamenti di Informatica - Linguaggio C - Espressioni e operatori
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
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2)
5
Fondamenti di Informatica - Linguaggio C - Espressioni e operatori
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)
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2)
6
Fondamenti di Informatica - Linguaggio C - Espressioni e operatori
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
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2)
7
Fondamenti di Informatica - Linguaggio C - Espressioni e operatori
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!
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2)
8
Fondamenti di Informatica - Linguaggio C - Espressioni e operatori
Operatori aritmetici unari
• Gli operatori aritmetici + e - possono essere utilizzati
anche come operatori unari:
-i
+i
a + (-x)
-(2*y) + x
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2)
9
Fondamenti di Informatica - Linguaggio C - Espressioni e operatori
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
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2)
10
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
0 = falso
≠0 = vero
NOTA: normalmente non è necessario che il
programma utilizzi esplicitamente questi valori, in
quanto si utilizzano le espressioni relazionali
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2)
11
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
é è falsa
i < j
é è vera
i >= j
é è falsa
i <= j
é è vera
i == j
é è falsa
i != j
é è vera
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2)
12
Fondamenti di Informatica - Linguaggio C - Espressioni e operatori
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
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2)
13
Fondamenti di Informatica - Linguaggio C - Espressioni e operatori
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
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2)
14
Fondamenti di Informatica - Linguaggio C - Espressioni e operatori
Operatori logici: AND
U = A && B
A
B
U
F
F
V
V
F
V
F
V
F
F
F
V
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2)
15
Fondamenti di Informatica - Linguaggio C - Espressioni e operatori
Operatori logici: AND
A && B è falsa se almeno
un operando è falso
A && B è vera se tutti gli
operandi sono veri
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2)
16
Fondamenti di Informatica - Linguaggio C - Espressioni e operatori
Operatori logici: OR
U = A || B
A
B
U
F
F
V
V
F
V
F
V
F
V
V
V
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2)
17
Fondamenti di Informatica - Linguaggio C - Espressioni e operatori
Operatori logici: OR
A || B è falsa se tutti gli
operandi sono falsi
A || B è vera se almeno un
operando è vero
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2)
18
Fondamenti di Informatica - Linguaggio C - Espressioni e operatori
Operatori logici: NOT
U = !A
A
U
F
V
V
F
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2)
19
Fondamenti di Informatica - Linguaggio C - Espressioni e operatori
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
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2)
20
Fondamenti di Informatica - Linguaggio C - Espressioni e operatori
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; assegno a z il valore 2*y - 1...
x = z - 3; …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;
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2)
21
Fondamenti di Informatica - Linguaggio C - Espressioni e operatori
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;
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2)
22
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;
x = x * (y + 1);
y += 5;
y = y + 5;
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2)
23
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;
y = x;
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2)
24
Fondamenti di Informatica - Linguaggio C - Espressioni e operatori
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
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2)
25
Fondamenti di Informatica - Linguaggio C - Espressioni e operatori
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… i = i + 1;
j = 2 * i;
mentre:
j = 2 * (i++); equivale a...
j = 2 * i;
i = i + 1;
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2)
26
Fondamenti di Informatica - Linguaggio C - Espressioni e operatori
Operatori di incremento e decremento
• ATTENZIONE:
i = i++;
j = 3/i - 2*(--i);
è indefinita !!!
è indefinita !!!
Infatti, il linguaggio non specifica quando viene
effettuato l’autoincremento o l’autodecremento
rispetto alla valutazione degli altri elementi
dell’istruzione.
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2)
27
Fondamenti di Informatica - Linguaggio C - Espressioni e operatori
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
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2)
28
Fondamenti di Informatica - Linguaggio C - Espressioni e operatori
Operatori logici: EXOR (or esclusivo)
U=A^B
A
B
U
0
0
1
1
0
1
0
1
0
1
1
0
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2)
29
Fondamenti di Informatica - Linguaggio C - Espressioni e operatori
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
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2)
30
Fondamenti di Informatica - Linguaggio C - Espressioni e operatori
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
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2)
31
Fondamenti di Informatica - Linguaggio C - Espressioni e operatori
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
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2)
32
Fondamenti di Informatica - Linguaggio C - Espressioni e operatori
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
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2)
33
Fondamenti di Informatica - Linguaggio C - Espressioni e operatori
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
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2)
34
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à...
1 1 1 0 1 0 1 1 0 1 1 1 0 0 0 0
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2)
35
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à...
0 0 0 1 0 1 1 1
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2)
36
Fondamenti di Informatica - Linguaggio C - Espressioni e operatori
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
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2)
37
Fondamenti di Informatica - Linguaggio C - Espressioni e operatori
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)
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2)
38
Fondamenti di Informatica - Linguaggio C - Espressioni e operatori
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!
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2)
39
Fondamenti di Informatica - Linguaggio C - Espressioni e operatori
Precedenza degli operatori
operatori
associatività
() [] -> .
! - + ++ -- * & (tipo) sizeof
* / %
+ << >>
< <= > >=
== !=
&
^
|
&&
||
?:
= += -= /= *= %= &= ^= |= <<= >>=
, (virgola)
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 sinistra a destra
da destra a sinistra
da destra a sinistra
da sinistra a destra
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2)
40

Documenti analoghi

Nota di Copyright Ricerca del massimo (da file) Sequenza

Nota di Copyright Ricerca del massimo (da file) Sequenza 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 tes...

Dettagli

lucidi a colori - diegm - Università degli Studi di Udine

lucidi a colori - diegm - Università degli Studi di Udine Questo insieme di 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 inc...

Dettagli

Il modello ISO/OSI e l`architettura TCP/IP - diegm

Il modello ISO/OSI e l`architettura TCP/IP - diegm 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, mu...

Dettagli