Linguaggio C

Operatori Espressioni

Operatori aritmetici, divisione intera e resto, cast, precedenza, assegnazione composta, incremento e operatori di confronto.

Primi Passi | Operatori Espressioni
Competenze previste
  • 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

OperatoreOperazioneEsempio con a = 17, b = 5
+sommaa + b vale 22
-sottrazionea - b vale 12
*moltiplicazionea * b vale 85
/divisionea / 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
Attenzione: se entrambi gli operandi sono interi, / 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.40

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

Attenzione: (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àOperatoriNote
1 (massima)( )le parentesi comandano sempre
2++ -- e castoperatori 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 abbreviataEquivale a
x += 10x = x + 10
x %= 5x = x % 5
x++ / ++xx = x + 1
x-- / --xx = 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: 2

x++ (postfisso) fornisce il valore attuale e poi incrementa; ++x (prefisso) incrementa e poi fornisce il valore nuovo.

Attenzione: non modificare più volte la stessa variabile nella stessa espressione (per esempio 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.

Attenzione: = è l'assegnazione, == è il confronto. Scrivere = al posto di == è uno degli errori più frequenti.

Verifica dei concetti

Tipo: autovalutazione   |   Argomento: Operatori ed espressioni

  1. Quanto valgono 17 / 5 e 17 % 5 con numeri interi?
  2. Come si ottiene la media reale di due variabili intere?
  3. Quale differenza c'è tra x++ e ++x?
  4. Che cosa calcola a + b / 2? Come si ottiene la media?
  5. Che differenza c'è tra = e ==?
In Sintesi
  • 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).
Cosa hai imparato
  • 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:

Operatore Espressione Divisione intera Modulo Cast Precedenza Incremento Confronto