next up previous contents index
Next: Costrutti condizionali e iterativi Up: Primi passi Previous: L'ingresso dei dati   Indice   Indice analitico

Gli operatori aritmetici

In questo paragrafo tratteremo un primo insieme di operatori del C++, precisamente gli operatori aritmetici. Cerchiamo però prima di tutto di dare una definizione di operatore: un operatore è un agente interno al linguaggio che accetta uno, due o tre argomenti di un certo tipo e restituisce un risultato, il quale potrebbe essere o non essere dello stesso tipo degli argomenti, a seconda dell'operatore. In C++ gli argomenti di un operatore possono essere formalmente molto diversi tra di loro, in base ad una filosofia di fondo di programmazione basata sulla flessibilità e sulla discrezione del programmatore; gli operatori verranno introdotti in maniera graduale all'interno del corso, mano a mano che se ne sentirà l'esigenza. Abbiamo già visto diversi operatori nei paragrafi precedenti, sebbene non li si sia chiamati con tale nome: l'operatore di assegnamento (=) e gli operatori di shift (<< e >>), i quali verranno in opportuna sede meglio descritti.

Gli operatori aritmetici in C++ sono i seguenti:

operatore operazione int double
+ somma $5+3=8$ $3.3+2=5.1$
- differenza $5-3=8$ $3.3-2=.3$
- negativo $-5=-5$ $-3.3=-3.3$
* prodotto $5*3=15$ $3.3*2=6.6$
/ quoziente $5/3=1$ $3.3/2=1.65$
% modulo $5\%3=2$  
       

Le operazioni corrispondenti ai singoli operatori sono del tutto analoghe a quelle che si effettuano comunemente; si faccia attenzione al fatto che gli operatori aritmetici restituiscono un risultato dello stesso tipo degli argomenti, così il quoziente calcolato con l'operatore / è intero se calcolato tra int e razionale se effettuato tra double; l'operatore modulo restituisce come risultato il resto della divisione intera di a per b, in maniera tale che valga la seguente identità:

\begin{displaymath}
\left(a \% b \right) + \left(a / b \right) * b= a
\end{displaymath}

come ci si può aspettare, l'operatore modulo non accetta come argomenti due numeri reali. Vedremo nel seguito qual è il tipo del risultato nel caso i due argomenti non abbiano lo stesso tipo, ad esempio se dividiamo un numero reale per un numero intero. Vediamo il seguente

// ex2_5_1.cpp
#include <iostream.h>
void main() {
   int a = 10, b = 4;
   double x = 10, y = 4;
   int c = a / b;
   double x = x / y;
   cout << c << "\n" << z << "\n";
}

output:
 2
 2.5

Siccome 10 non è divisibile per 4, la parte decimale viene troncata automaticamente. Si noti che è possibile creare più variabili dello stesso tipo, ed eventualmente inizializzarle con un valore, semplicemente separandole con una virgola, come int a = 10, b = 4.

Consideriamo adesso un altro problema: qual è il significato di una operazione del tipo: a = b + c * d, ovvero quali sono le precedenze che il compilatore rispetta per gli operatori aritmetici? Ebbene esistono delle regole ben precise per stabilire univocamente quale debba essere l'ordine di valutazione degli operatori, non solo aritmetici; essendo però alquanto complicate e difficili da ricordare, nella maggior parte dei casi conviene affidarsi al buon senso e, soprattutto, all'utilizzo di un nuovo operatore: le parentesi tonde ( ). Tale operatore fa sì che le precedenze normalmente esistenti tra gli altri operatori di una espressione saltino, e venga considerata per prima l'espressione che le parentesi racchiudono; grazie a questo operatore è possibile scrivere programmi molto più chiari, senza avere bisogno di consultare le tabelle con gli ordini di precedenza degli operatori, o peggio di doverle imparare a memoria. Ad esempio


a = b * (c / d)
è molto più chiaro di

a = b * c / d;
sebbene il risultato sia infine lo stesso. In molti casi le parentesi sono obbligatorie:

a = (b + c) * d
non ha affatto lo stesso risultato di

a = b + c * d
in quanto, come nelle regole dell'aritmetica comune, moltiplicazione e divisione in C++ vengono effettuate prima della somma e della sottrazione.

Come abbiamo detto, in C++ gli operatori possono avere uno, due o tre argomenti; si noti come gli operatori aritmetici siano tutti binari (cioè hanno due argomenti) tranne l'operatore negativo (-), il quale è unario, infatti il suo unico argomento è il numero cui cambiare segno 2.5. Un esempio contenente alcuni degli operatori sin quì descritti è il seguente:


// ex2_5_2.cpp
// calcola la somma dei primi n numeri interi
#include <iostream.h>
void main() {
   int n;
   cout << "n = ";
   cin >> n;
   int somma = n * (n + 1) / 2;  // nota formula di Gauss
   cout << "la somma dei numeri da 1 a " << n;
   cout << " e'\t" << somma;
}



Oltre agli operatori aritmetici già presentati ne esistono altri, che ne costituiscono dei sinonimi sintattici2.6:

operatore operazione
++ incremento unitario
-- decremento unitario
+= somma e assegnamento
-= differenza e assegnamento
*= prodotto e assegnamento
/= quoziente e assegnamento
%= modulo e assegnamento
   

I primi due operatori sono unari ed accettano come unico argomento il numero da incrementare o decrementare:


// ex2_5_3.cpp
#include <iostream.h>
void main() {
   int a = 7, b = a;
   a++;
   b--;
   b--;
   cout << a << "\t" << b;
}

output:
 8 5

Gli altri operatori non sono altro che una combinazione dell'operatore di assegnamento e di un operatore aritmetico; si noti l'equivalenza nel seguente:


// ex2_5_4.cpp
#include <iostream.h>
void main() {
   int a = 7, b = a;
   double x = 5, y = x;
   a = a - 3;
   b -= 3;
   x = x / 2;
   y /= 2;
   cout << a << "\t" << b << "\n";
   cout << x << "\t" << y;
}

output:
 4 4
 2.5 2.5

Come si può vedere, esistono ben tre sinonimi sintattici per le operazioni riguardanti incremento e decremento unitario: a++ equivale a a +=1 equivale a a = a + 1, e così per la differenza; questa ridondanza di sintassi è dovuta al fatto che, come vedremo, tali operazioni sono abbastanza frequenti da ``meritare un nome proprio''.

ex-2
si scriva un programma che calcoli la media aritmetica di tre numeri reali immessi dall'utente;
ex-3
si scriva un programma che calcoli la somma dei cubi dei primi $n$ numeri interi; si utilizzi la seguente formula:

\begin{displaymath}
1^3 + 2^3 + \ldots + n^3 = \left[ \frac{n(n+1)}{2} \right]^2
\end{displaymath}


next up previous contents index
Next: Costrutti condizionali e iterativi Up: Primi passi Previous: L'ingresso dei dati   Indice   Indice analitico
Claudio Cicconetti
2000-09-06