• Non ci sono risultati.

Nota di Copyright

N/A
N/A
Protected

Academic year: 2021

Condividi "Nota di Copyright"

Copied!
40
0
0

Testo completo

(1)

FONDAMENTI DI INFORMATICA

Prof. PIER LUCA MONTESSORO Ing.DAVIDE PIERATTONI

Facoltà di Ingegneria

Università degli Studi di Udine

Linguaggio C

Espressioni e operatori

(2)

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.

Nota di Copyright

(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

(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

(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

(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)

(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

(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!

(9)

Operatori aritmetici unari

• Gli operatori aritmetici + e - possono essere utilizzati anche come operatori unari:

-i +i

a + (-x) -(2*y) + x

(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

(11)

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

programma utilizzi esplicitamente questi valori, in quanto si utilizzano le espressioni relazionali

0 = falso ≠ 0 = vero

(12)

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

(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

(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

(15)

Operatori logici: AND

A B U

F F F

F V F

V F F

V V V

U = A && B

(16)

Operatori logici: AND

A && B è falsa se almeno un operando è falso

A && B è vera se tutti gli

operandi sono veri

(17)

Operatori logici: OR

A B U

F F F

F V V

V F V

V V V

U = A || B

(18)

Operatori logici: OR

A || B è falsa se tutti gli operandi sono falsi

A || B è vera se almeno un

operando è vero

(19)

Operatori logici: NOT

A U

F V

V F

U = !A

(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

(21)

• 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;

(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;

(23)

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;

(24)

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;

(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

(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;

(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.

(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

(29)

Operatori logici: EXOR (or esclusivo)

A B U

0 0 0

0 1 1

1 0 1

1 1 0

U = A ^ B

(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

(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

(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

(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

(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

(35)

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

(36)

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

(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

(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)

(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!

(40)

Precedenza degli operatori

operatori

() [] -> .

! - + ++ -- * & (tipo) sizeof

* / % + -

<< >>

< <= > >=

&

^

|

&&

||

?:

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

== !=

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

Riferimenti

Documenti correlati

- Rappresentanti dell’ATS Brianza promotori del progetto “ATS Brianza libera da contenzioni”. - Sindaco del Comune

[r]

Ma, anche i più esperti potranno trarre beneficio dall'avere riassunti in una unica tabella tutti gli operatori con le loro precedenze e associatività (= ordine di precedenza

Si osservi che, come già detto in precedenza, le componenti del laplaciano vettoriale non sono i laplaciani scalari delle componenti del vettore A, come avviene invece in

 Alla valutazione, Alla valutazione, T T deve essere istanziato ad un termine deve essere istanziato ad un termine che denota una clausola; se più clausole sono unificabili

• precedenza (è indicata con un numero, compreso in un intervallo dipendente dalla particolare implementazione, più basso è il numero, più alta è la precedenza

Infatti, possiamo no- tare che i soggetti poco insicuri ottengono punteggi più bassi, rispetto ai soggetti più insicuri nella difficoltà di con- tatto fisico finalizzato all’aiuto ed

Sia Ql matrice ortogonale tale che QlaQì = D&gt;, dove D&gt;, è la matrice diagonale avente come elementi gli autovalori di a, À 1 , .... Per questo motivo intro- duciamo una