Operatori in C 🇬🇧
Note a cura di Antonino Furnari - antonino.furnari@unict.it🔝
Università di Catania, Dipartimento di Matematica e Informatica
Note disponibili qui: http://www.antoninofurnari.github.iohttps://antoninofurnari.github.io/lecture-notes/it/programmazione-c/operatori/
Una volta definite delle variabili, possiamo utilizzarle per effettuare della computazione mediante gli operatori.
Assegnamento (=)
L’operatore assegnamento ha l’effetto di cambiare il valore contenuto all’interno di una variabile:
|
|
Le operazioni di assegnamento sono delle espressioni che restituiscono il valore dell’assegnamento. Ad esempio, l’espressione x=5
restituisce il numero 5. Esempi:
|
|
3
5
Anche espressioni del genere sono valide in C:
|
|
2 2 2
Domanda Si scriva un codice che:
|
Operatori aritmetici ( +, -, *, /, % )
C supporta $5$ operazioni fondamentali, associate ad altrettanti operatori:
operator | description |
---|---|
+ | addition |
- | subtraction |
* | multiplication |
/ | division |
% | modulo |
Esempi di utilizzo degli operatori:
|
|
L’operatore modulo %
restituisce invece il resto della divisione tra due numeri interi. Ad esempio:
|
|
0
Quando si usa l’operatore di divisione (/
), bisogna stare particolarmente attenti ai tipi degli operandi. Se entrambi gli operandi sono interi, allora il risultato dell’operazione sarà un numero intero (il quoziente della divisione). Ad esempio:
|
|
1
0
2
Lo stesso discorso vale usando variabili di tipo int al posto dei letterali:
|
|
0
Se vogliamo una divisione in virgola mobile invece che intera, dobbiamo forzare almeno uno degli operandi ad essere un numero in virgola mobile:
|
|
0.666667
1.500000
0.666667
Domanda Si scriva un codice che:
|
Assegnamento composto (+=, -=, *=, /=)
Quando la variabile di cui cambiamo il valore appare anche nel lato destro dell’espressione, l’operazione è anche detta di aggiornamento. Ad esempio:
|
|
Per queste operazioni esiste anche una notazione abbreviata:
|
|
Incremento e decremento
Le operazioni di incremento e decremento di una unità sono molto comuni e quindi esistono delle “notazioni abbreviate” per esse. Queste espressioni restituiscono inoltre un valore di ritorno:
|
|
|
|
Analoghe espressioni esistono per il decremento:
|
|
|
|
Domanda Qual è il valore stampato da questo codice?
|
Relazioni e comparazioni (==, !=, >, <, >=, <=)
Due espressioni possono essere comparate utilizzando degli appositi operatori, ad esempio per vedere se il valore contenuto in una variabile è maggiore o minore di un dato valore. Il risultato di queste operazioni di comparazione è un booleano. Gli operatori relazionali in C sono i seguenti:
operator | description |
---|---|
== | Equal to |
!= | Not equal to |
< | Less than |
> | Greater than |
<= | Less than or equal to |
>= | Greater than or equal to |
Ecco alcuni esempi di comparazioni:
|
|
Chiaramente è possibile comparare anche variabili al di là di costanti numeriche (letterali), Ad esempio:
|
|
Bisogna fare attenzione a non confondere l’operatore di comparazione ==
con quello di assegnamento =
. Ad esempio, nell’espressione scritta sopra b=2
assegna 2
a b
, non controlla che b
sia uguale a 2
.
Il risultato di una comparazione può essere assegnato a una variabile booleana:
|
|
Un utilizzo pratico dell’operatore modulo consiste nel verificare se un numero è multiplo di un altro numero. Infatti, in tal caso, il resto della divisione del primo numero per il secondo sarà pari a zero. Esempi:
|
|
0
1
0
Domanda Cosa stampa il seguente codice?
|
Operatori logici
Gli operatori logici in C ci permettono di implementare l’algebra booleana. In C, l’operatore !
rappresenta il not
logico. Gli altri operatori logici sono &&
, che rappresenta l’and
logico e ||
, che rappresenta l’or
logico. Questi operatori seguono le seguenti regole:
&& OPERATOR (and) | ||
---|---|---|
a | b | a && b |
true | true | true |
true | false | false |
false | true | false |
false | false | false |
|| OPERATOR (or) | ||
---|---|---|
a | b | a || b |
true | true | true |
true | false | true |
false | true | true |
false | false | false |
Ad esempio:
|
|
Quando si usano gli operatori logici, C valuta solo ciò che è necessario valutare da sinistra a destra, ignorando il resto. Ad esempio, quando viene valutata l’espressione ((5==5)||(3>6))
, C valuterà se 5==5
. Dato che il risultato è true
e le espressioni true || false
e true || true
valutano entrambe a true
, C non valuterà mai l’espressione 3>6
in quanto ciò non è necessario per trovare il valore di verità dell’espressione ((5==5)||(3>6))
. Questo tipo di valutazione è detta anche valutazione a corto circuito o short-circuit evaluation e funziona come segue:
operator | short-circuit |
---|---|
&& | if the left-hand side expression is false , the combined result is false (the right-hand side expression is never evaluated). |
|| | if the left-hand side expression is true , the combined result is true (the right-hand side expression is never evaluated). |
Domanda Cosa stampa il seguente codice?
|
Operatore condizionale ternario (?)
Questo operatore valuta una espressione e restituisce un valore se l’espressione è vera, mentre ne restituisce un altro se questa è falsa. La sua sintassi è condizione ? risultato_true : risultato_false
, dove risultato_true
è il valore restituito se condizione
è vera, mentre risultato_falso
è il valore restituito se condizione
è falsa. Vediamo qualche esempio:
|
|
a!=b
a<=b
max(a,b)=7
Domanda Cosa stampa il seguente codice?
|
Operatori di casting di tipo esplicito
Gli operatori di casting di tipo permettono di convertire esplicitamente una variabile da un tipo a un altro:
|
|
2
Il casting può essere utile quando si devono fare divisioni tra interi:
|
|
0.333333
Domanda Cosa stampa il seguente codice?
|
Arrotondamento
Va notato che la conversione da numero in virgola mobile a int non effettua nessun arrotondamento. Ad esempio:
|
|
Un modo semplice per arrotondare correttamente, consiste nel sommare $0.5$ al numero da arrotondare:
|
|
In generale quindi:
|
|
9
sizeof
L’operatore sizeof permette di conoscere la dimensione in byte di un tipo o di una variabile. Ad esempio, un intero di solito occupa 4 byte:
|
|
4
4
8
L’operatore sizeof
restituisce un long int
, quindi dobbiamo usare il formato %lu
.
Esercizio Si scriva un programma che:
|
Esercizio Si scriva un programma che:
|