Ultima modifica:
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.
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.
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":
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.
4.2 - Associatività degli operatori
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"
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.
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)
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.