- Usare gli operatori aritmetici + - * / %.
- Distinguere la divisione intera da quella reale e applicare il cast.
- Valutare un'espressione tenendo conto della precedenza.
- Usare assegnazione composta, incremento e decremento.
- Riconoscere gli operatori di confronto e la differenza tra = e ==.
Operatori aritmetici
Operatori: + - * / % | Attenzione: divisione tra interi
| Operatore | Operazione | Esempio con a = 17, b = 5 |
|---|---|---|
+ | somma | a + b vale 22 |
- | sottrazione | a - b vale 12 |
* | moltiplicazione | a * b vale 85 |
/ | divisione | a / b vale 3 (intera); 17.0 / 5 vale 3.4 |
% | resto della divisione (solo interi) | a % b vale 2 |
#include <stdio.h>
int main(void)
{
int a = 17, b = 5;
printf("a + b = %d\n", a + b);
printf("a - b = %d\n", a - b);
printf("a * b = %d\n", a * b);
printf("a / b = %d\n", a / b);
printf("a %% b = %d\n", a % b);
printf("17.0 / 5 = %.2f\n", 17.0 / 5);
printf("a > b vale %d\n", a > b);
printf("a == b vale %d\n", a == b);
return 0;
}a + b = 22
a - b = 12
a * b = 85
a / b = 3
a % b = 2
17.0 / 5 = 3.40
a > b vale 1
a == b vale 0/ esegue la divisione intera e scarta i decimali: 17 / 5 vale 3, non 3.4. Per ottenere il risultato reale almeno un operando deve essere decimale.Il cast
Operatore: (tipo) | Uso: conversione esplicita
Il cast converte un valore in un altro tipo. Scrivendo (float)somma davanti a una variabile intera, la divisione successiva diventa reale.
#include <stdio.h>
int main(void)
{
int somma = 17, n = 5;
float media_errata = somma / n;
float media = (float)somma / n;
printf("Senza cast: %.2f\n", media_errata);
printf("Con cast : %.2f\n", media);
return 0;
}Senza cast: 3.00
Con cast : 3.40Nella prima riga la divisione somma / n avviene tra interi e dà 3: il risultato viene convertito in float solo dopo, quando i decimali sono già persi. Il cast va applicato prima della divisione.
(float)(somma / n) è sbagliato: la divisione intera avviene dentro le parentesi, prima del cast.Precedenza degli operatori
Regola: prima la priorità più alta | Aiuto: parentesi
| Priorità | Operatori | Note |
|---|---|---|
| 1 (massima) | ( ) | le parentesi comandano sempre |
| 2 | ++ -- e cast | operatori unari |
| 3 | * / % | da sinistra a destra |
| 4 | + - | da sinistra a destra |
| 5 | < <= > >= | confronti |
| 6 | == != | uguaglianza |
| 7 (minima) | = += -= *= /= %= | assegnazioni |
L'espressione a + b / 2 calcola prima b / 2 e poi somma a; per fare la media di a e b servono le parentesi: (a + b) / 2.
Assegnazione composta, incremento e decremento
Scopo: scrivere meno codice | Operatori: += ++ --
| Forma abbreviata | Equivale a |
|---|---|
x += 10 | x = x + 10 |
x %= 5 | x = x % 5 |
x++ / ++x | x = x + 1 |
x-- / --x | x = x - 1 |
#include <stdio.h>
int main(void)
{
int x = 5;
printf("x++ vale %d\n", x++);
printf("ora x vale %d\n", x);
printf("++x vale %d\n", ++x);
x += 10;
printf("dopo x += 10: %d\n", x);
x %= 5;
printf("dopo x %%= 5: %d\n", x);
return 0;
}x++ vale 5
ora x vale 6
++x vale 7
dopo x += 10: 17
dopo x %= 5: 2x++ (postfisso) fornisce il valore attuale e poi incrementa; ++x (prefisso) incrementa e poi fornisce il valore nuovo.
x = x++ + ++x): il risultato non è definito dallo standard.Operatori di confronto
Operatori: == != < > <= >= | Risultato: 1 se vero, 0 se falso
In C il risultato di un confronto è un intero: 1 se è vero, 0 se è falso (nell'output di operatori.c lo hai già visto con a > b). Li useremo per prendere decisioni nell'unità sulle strutture di controllo.
= è l'assegnazione, == è il confronto. Scrivere = al posto di == è uno degli errori più frequenti.Laboratorio guidato — Da minuti a ore e minuti
Obiettivo: usare divisione intera e resto per convertire un'unità di misura.
Software: VS Code, gcc, terminale. Tempo previsto: 25 minuti.
Prerequisiti: lezione su input e output completata.
Procedura passo passo
- Crea il file
oreminuti.c. Dichiara tre variabiliint:totale,ore,minuti. - Chiedi all'utente la durata in minuti con
printfe leggila conscanf("%d", &totale);. - Calcola le ore intere con
ore = totale / 60;: la divisione tra interi scarta il resto. - Calcola i minuti rimanenti con
minuti = totale % 60;. - Stampa il risultato nella forma
135 minuti = 2 ore e 15 minuti. - Compila ed esegui con i valori
135,60e59e confronta con la tabella. - Rifletti: che cosa cambierebbe se per le ore usassi
%al posto di/?
Durata in minuti: 135
135 minuti = 2 ore e 15 minuti| Minuti inseriti | Risultato |
|---|---|
| 135 | 2 ore e 15 minuti |
| 60 | 1 ore e 0 minuti |
| 59 | 0 ore e 59 minuti |
Il programma non distingue ancora singolare e plurale («1 ore»): lo correggeremo con le condizioni.
Verifica del risultato
| Controllo | Che cosa devi riconoscere |
|---|---|
| Ore | Quoziente intero della divisione per 60. |
| Minuti | Resto della divisione per 60. |
| Verifica | ore × 60 + minuti dà di nuovo il totale inserito. |
- Le ore hanno decimali o i minuti sono sbagliati: controlla di aver dichiarato le variabili come
int. - Il programma mostra
0 oreper valori grandi: hai scambiato/e%. - Warning sul formato: usa
%dper le variabili intere.
Esercizio autonomo
Scrivi celsius.c: legge una temperatura in gradi Celsius (float) e stampa i gradi Fahrenheit, calcolati con F = C × 9 / 5 + 32, con una cifra decimale.
Temperatura in gradi Celsius: 37
37.0 C = 98.6 F
Temperatura in gradi Celsius: 100
100.0 C = 212.0 FSoluzione (da aprire solo dopo aver provato)
#include <stdio.h>
int main(void)
{
float c, f;
printf("Temperatura in gradi Celsius: ");
scanf("%f", &c);
f = c * 9 / 5 + 32;
printf("%.1f C = %.1f F\n", c, f);
return 0;
}Attenzione all'ordine: scrivere 9 / 5 * c darebbe un risultato sbagliato, perché 9 / 5 è una divisione tra interi e vale 1.
Verifica dei concetti
Tipo: autovalutazione | Argomento: Operatori ed espressioni
- Quanto valgono
17 / 5e17 % 5con numeri interi? - Come si ottiene la media reale di due variabili intere?
- Quale differenza c'è tra
x++e++x? - Che cosa calcola
a + b / 2? Come si ottiene la media? - Che differenza c'è tra
=e==?
- La divisione tra interi scarta i decimali;
%restituisce il resto. - Il cast
(float)applicato prima della divisione dà un risultato reale. - La precedenza stabilisce l'ordine di calcolo; le parentesi la modificano.
+=,++e--abbreviano le modifiche di una variabile.- I confronti restituiscono 1 (vero) o 0 (falso).
- Hai usato gli operatori aritmetici e il resto.
- Hai evitato l'errore della divisione intera con il cast.
- Hai valutato espressioni usando precedenza e parentesi.
- Hai convertito unità di misura con un programma.
Parole chiave
I termini principali introdotti in questa guida sono: