Guida [VECCHIO CORSO]Corso programmazione linguaggio C - Lezione #5 : Operatori e espressioni

giovy2707

Utente Electrum
27 Giugno 2019
96
38
62
103
Ultima modifica:
LEZIONE X IMMAGINE(1).png


LEGGI QUESTO PRIMA DI CONTINUARE

Se non hai già letto le avvertenze/istruzioni presenti nella LEZIONE 1 ti invito a leggerle (puoi farlo da questo link: Lezione 1 ) , ho evitato di fare copia e incolla delle varie avvertenze/istruzioni poiché mi sembrava inutile aggiungere a ogni post tutto quel testo.

FILE ZIP DEL CORSO :

Vedi: https://drive.google.com/file/d/1sPuNna2S3b0sqmFHK448j4vKg1MVUlSM/view?usp=sharing




NOTA PER I LETTORI: Ed ecco la 5 lezione, anche se un pò in ritardo..., mi spiace per il ritardo, ma non vi preoccupate ho già iniziato a lavorare alla 6. Ne approfitto per ringraziare @SmoonStyle @St3ve per avermi insegnato un metodo per esportare le parole evidenziate mooolto più velocemente di prima, facendomi risparmiare così un botto di tempo (pensa che stupido io che le facevo tutte a mano). Oltre a questo vi avverto che quelli elencati in questa lezione non sono tutti gli operatori che vedremo, nella prossima e nelle prossime lezioni vi parlerò di altri operatori, di cui non vi ho parlato in questa lezione poiché sono fortemente collegati ad altri argomenti e quindi ho pensato fosse meglio parlarne insieme a tali argomenti quando sarà il momento.

PS. @St3ve meriterebbe doppio ringraziamento per le informazioni che mi ha fornito per la precedente lezione.

1 - Operatori

Un' operatore è una istruzione che viene applicata ad un insieme di dati detti operandi, tale operazione genererà un risultato, che viene detto operazione.

1666638710920.png


I tre tipi basilari di operatori sono:

- Operatori aritmetici
- Operatori di confronto
- Operatori logici

Oltre a questi tipi ci sono anche altri operatori.


2 - Espressioni

Una espressione è una serie di operatori e operandi (quindi una serie di operazioni), che può essere valutata da un compilatore per produrre un risultato.


2.1 - LVALUE

Un LVALUE (left value) è un'espressione che individua un'aria di memoria (di solito una variabile) e che viene posta alla sinistra dell'operatore (ad esempio quello di assegnamento)

C:
a = 10;

//'a' è un LVALUE cioè l'espressione che sta alla sinistra dell'operatore.

1666638835084.png



2.2 - RVALUE

Un RVALUE (right value) è un'espressione che viene posta alla destra dell'operatore (ad esempio quello di assegnamento), la cui valutazione genera un risultato che poi viene applicato (influisce in qualche modo) ad un LVALUE.


3 - Operatore di assegnamento

Un'operatore di assegnamento prende il risultato di un "rvalue" e lo assegna ad un "lvalue":

1666638892841.png



4 - Operatori aritmetici binari

Vengono detti operatori binari in quanto vengono applicati su coppie di operandi, gli operatori aritmetici binari di base sono:

- Somma (+)

- Sottrazione (-)

- Moltiplicazione (\*)

- Divisione ( / )

- Modulo (% , resto della divisione)


4.1 - Precedenza degli operatori

Ogni operatore ha una determinata precedenza di applicazione, per esempio la moltiplicazione e la divisione hanno una maggiore precedenza rispetto alla somma e alla sottrazione.

C:
x = 5 + 10 * 2; //25

//infatti viene fatta prima la moltiplicazione e poi la somma.

1666644037063.png



4.2 - Associatività degli operatori

1666639072513.png


Succede che entra in gioco l'associatività, cioè quella regola che dice quale operatore va eseguito prima nei casi in cui ne abbiamo 2 o più con la stessa priorità.

L'associatività può essere da destra verso sinistra o da sinistra verso destra (quasi sempre è da sinistra verso destra).

C:
//Qui abbiamo l'associatività da sinistra verso destra.

x = 5 + 10 / 2 * 5; //30

//1. in questo caso avviene prima la divisione
//2. poi la moltiplicazione
//3. e in ultimo l'addizione


4.3 - Operatore "parentesi tonde"

1666639117754.png


Beh, in quel caso ci basta utilizzare l'operatore parentesi tonde.

C:
a = ( 2 + 3 ) * 6 / 2 + 2; //17

//1. Viene eseguita l'operazione tra le parentesi.
//2. Viene eseguita l'associatività di default


5 - Operatore di divisione

L'operatore di divisione oltre a fare la classica divisione ha un comportamento particolare: quando facciamo la divisione tra due interi la parte decimale viene troncata, mentre se la divisione avviene tra due floating point allora la parte decimale viene mantenuta.

1666639385150.png



6 - Operatori unari

Gli operatori unari agiscono su un singolo operando.


6.1 - Operatori + e -

L'operatore unario ' - ' restituisce il valore di input con segno invertito, mentre l'operatore ' + ' non cambia nulla (anche se proviamo ad applicarlo ad un valore negativo).

C:
x = 10;
x = -x; // x = -10

x = -10;
x = -x; // x = +10

x = -10;
x = +x; // x = -10

x = 10;
x = +x; // x = 10


6.2 - Operatori di incremento ++ e decremento --

Gli operatori di incremento e decremento servono a incrementare o decrementare di una unità un determinato valore, essi posso essere usati come:

- prefisso

- post-fisso

la differenza sostanziale è che se sono in prefisso allora il valore verrà prima incrementato e poi valutato nel resto dell'espressione, mentre in post-fisso avviene il contrario.

C:
x = 10;
a = a + ++x; //x viene incrementata di 1 e poi gli viene sommata a.
// a = 16

x = 10;
a = a + x++; //x viene sommato ad a poi la variabile x viene incrementata di 1.

//a = 15


7 - Operatore di assegnamento composto

L'operatore di assegnamento composto permette di semplificare la sintassi in casi come questo:

C:
int a = 10;
int b = 20;

a = a + b; //30

questa sintassi può essere semplificata in questo modo:

C:
a += b; //30

gli operatori di assegnamento composti ci permettono infatti di fare cose come:

- comporre un unico operatore usando l'operatore di assegnamento con gli operatori aritmetici.

I principali operatore di assegnamento composto sono:

- + = (somma il valore della variabile a "qualcosa" (valore altre variabili ecc...) e assegna il risultato alla variabile)

- - = (sottrai il valore della variabile con "qualcosa" (valore altre variabili ecc...) e assegna il risultato alla variabile)

- \*= (moltiplica il valore della variabile con "qualcosa" (valore altre variabili ecc...) e assegna il risultato alla variabile)

- / = (dividi il valore della variabile con "qualcosa" (valore altre variabili ecc...) e assegna il risultato alla variabile)

- % = (calcola il modulo (il resto) del valore della variabile diviso con "qualcosa" (valore altre variabili ecc...) e assegna il risultato alla variabile)

Però è bene ricordare che non è possibile fare qualcosa del genere:

C:
int a = 10;
int b = 20;
int c = 30;

a = a * b + c; /*--->*/ a *= b + c;

poiché la moltiplicazione verrebbe fatta dopo la somma.


8 - Sizeof

L' operatore sizeof si applica ad un unico operando e restituisce la quantità di memoria che il compilatore ha riservato all' operando a cui viene applicato l'operatore.

La sintassi per l'uso del sizeof è la seguente:

C:
sizeof(variabile); //attentione: tale operatore restituisce un risultato è quindi consigliabile l'uso di una variabile o una printf per stampare il risultato


9 - Conversioni esplicite

Quando vogliamo convertire un determinato dato in un data-type in particolare a nostra scelta possiamo ricorrere all'operatore di type-casting, l' operatore di type-casting ha la seguente sintassi:

C:
(type-name) espressione; //il risultato dell'espressione subirà un cambio di data-type (sarà convertito nel tipo tra parentesi)

1666639709081.png


La soluzione è usare il type-casting:

C:
double a;
int b=20,c=6;

a = (double) b / c;

Grazie a questo operatore i valori delle 2 variabili verranno convertiti in double prima della divisione , quindi quando verrà eseguita la divisione avremo una divisione tra 2 valori double, e quindi non perderemo la parte decimale del risultato.

1666639762227.png

1666639784037.png
 

Allegati

  • 5.Operatori e espressioni.pdf
    602 KB · Visualizzazioni: 4
Buonaseraaa, si lo so non pubblico una lezione da mooolto , mi spiace , sono stato un pò incasinato :asd:, però domani probabilmente pubblicherò la 6 lezione e magari aggiorno anche delle cose nella lezione precedente