CAPITOLO 2 - Tipi di dati e operatori in C++.

2.4 – Espressioni numeriche e booleane

Ogni espressione in un programma deve essere calcolata (o valutata) durante l’esecuzione.

Espressioni numeriche: rappresentano operazioni tra numeri

Lo schema seguente raggruppa le operazioni standard:

Operazione Simbolo algebrico Simbolo in C++ Espressione algebrica Espressione in C++
Addizione + + a+b a+b
Sottrazione - - a-b a-b
Moltiplicazione × * a×b a*b
Divisione : / a:b a/b
Modulo mod % a mod b a%b

L’operatore modulo può essere applicato soltanto su operandi interi perché restituisce il resto della divisione tra interi. Per esempio, se a e b sono due variabili di tipo int, posto a=14 e b=3, a/b restituisce 4 come risultato, il quoziente di a:b, cioè 14:3, mentre a%b restituisce come risultato 2, il resto della divisione tra a e b, cioè il resto della divisione tra 14 e 3.
L'operatore % è molto utile per verificare se un numero è multiplo di un altro, perché in tal caso deve restituire resto 0. Per esempio, per verificare che N è pari basta controllare N%2: se è zero allora è pari, altrimenti è dispari.

Poiché una qualsiasi espressione in C++ deve essere scritta su di una sola linea, è necessario servirsi delle parentesi tonde ( le uniche che si possono utilizzare nelle espressioni ) per poter scrivere espressioni anche molto complesse. È, quindi, opportuno stabilire, in presenza di più operatori, quali operazioni vanno svolte per prima. In altre parole, dobbiamo assegnare agli operatori un ordine di valutazione; questa problematica va sotto il nome di priorità degli operatori.

Dal punto di vista algebrico sappiamo che prima vanno svolte le parentesi, dopo le operazioni di moltiplicazione e divisione, a cui va aggiunto il modulo, ed infine le addizioni e sottrazioni. Anche il C++ segue lo stesso schema, tenendo, però, presente che là dove compaiono più operatori allo stesso livello ( cioè con la stessa precedenza ), essi vengono applicati da sinistra a destra. In definitiva, la precedenza tra gli operatori aritmetici può essere schematizzata nel modo seguente:

1. per prima vengono calcolate le espressioni poste tra parentesi a partire da quelle più interne ( parentesi nidificate ); le parentesi allo stesso livello, vengono invece valutate da sinistra a destra nell’ordine in cui si presentano.

Esempio.

L’espressione 5 + 3 *(6 - (4 + 2 * 3)) viene svolta in quest’ordine

5 + 3 * (6 – (4 + 6)) = 5 + 3 * (6 – 10) = 5 + 3 * – 4 = 5 – 12 = -7;

il risultato finale dell’espressione è -7.

2. Subito dopo le parentesi vengono le operazioni di moltiplicazione, divisione e modulo; se appaiono più operazioni dello stesso tipo esse vengono svolte da sinistra a destra.

Esempio.

Seguiamo passo-passo la risoluzione dell’espressione

10 – 4 + 2 * (3 – 2 * 8 /4 + 3*(4 + 2 * 8 % 5) – 10 ) =

=6 + 2 * ( 3 – 16 /4 + 3 *(4 + 16 % 3 ) – 10) = 6 + 2 * ( 3 – 4 + 3 *(4 + 1 ) – 10) =

=6 + 2 * ( – 1 + 3 * 5 – 10) = 6 + 2 * ( – 1 + 15 – 10) = 6 + 2 * 4 =6 + 8 = 14

Notiamo che l’operazione iniziale 10 – 4 può essere risolta subito, mentre la successiva addizione non può essere svolta perché seguita da una moltiplicazione.

3. Le ultime ad essere eseguite sono le operazioni di addizione e sottrazione; anche in questo caso, se appaiono più operazioni dello stesso tipo vengono valutate da sinistra a destra.

Esempio.

Risolviamo anche questa espressione

4 + 5 * (2 + 12 /3) – 20 / (8 – 2 * 3) + 10 % 3 - 4 =

=4 + 5 * (2 + 4) – 20 / (8 – 6) + 1 - 4 = 4 + 5 * 6 – 20 / 2 - 3 =

=4 + 30 – 10 - 3 = 34 – 10 + – 3 = 24 – 3 = 21

Se i letterali, le costanti e le variabili sono tutti dello stesso tipo allora anche il valore dell’espressione sarà dello stesso tipo. Cosa accade quando questa proprietà non è soddisfatta? Se tutte le grandezze presenti nell’espressione sono di tipo numerico, anche se diversi, sarà il compilatore ad effettuare tutte le opportune conversioni di tipo. Ad esempio se le variabili n, f, d sono rispettivamente di tipo int, float e double allora nell’espressione (n+f)*d, n è convertito a float, successivamente la somma n+f è convertita a double per poter effettuare la moltiplicazione con d (conversione implicita).

NB. In C++ sono permesse anche espressioni del tipo n+car +b dove n è un intero, car un carattere e b una variabile booleana. Se ad esempio n vale 4, car è la lettera A e b vale true, il valore dell’espressione sarà 4+65+1=70. L’uso di espressioni contenenti variabili numeriche e non numeriche non è in genere consigliabile e può dare luogo in un programma ad errori che sono difficili da individuare.

In questo testo tutti i programmi in genere si conformeranno a questa regola.

sulle espressioni numeriche intere.

Espressione booleana semplice: è rappresentata da un confronto tra i valori di due espressioni. La forma sintattica di una espressione booleana semplice è la seguente:

espressione1 op espressione2

dove op è un operatore relazionale. L’espressione booleana assume il valore "1" (vero) se il valore di espressione1 è nella relazione op con il valore di espressione2 .

Scrivere a<b può essere vero ( 1 ) o falso ( 0 ), a seconda dei valori assunti da a e b dove a e b possono essere numeri, caratteri o stringhe. Lo stesso vale anche per gli altri operatori riportati nella tabella seguente:

Operatore relazionale in C++ Nell’esempio si suppone che le variabili assumono i seguenti valori:a=3 ; b=5 ; c1=’E’ ; c2=’G’ ;
< Minore di a<b 3<5 vero
<= Minore o uguale di a+3<=b 6<=5 falso
== uguale c1==c2 'E'=='G' falso
!= diverso da c1!=c2 'E'!='G' vero
> Maggiore di 'a'>c1 'a'>'E' vero
>= Maggiore o uguale di a>b+2 3>7 falso