Variabile = Variabile operazione Espressione;
che traduce esempi come
i = i + 1 i = i – 1 somma = somma + i p = p * h
questi possono essere scritti in modo compatto, rispettivamente, come
Variabile operatore = espressione;
i++ i– somma += i p *= h
In particolare i primi due termini i = i + 1 ed i = i – 1, sono detti rispettivamente operatori di incremento e decremento.
Tali operatori hanno due forme:
una forma postfissa (i++, i–) e la forma prefissa (++i , –i).
Gli operatori di incremento ++ o decremento – - aumentano o diminuiscono di un’unità il valore dell’operando (l-value di tipo standard)
var++; equivale a var = var + 1;
++var; equivale a var = var + 1;
la forma incremento (o decremento) conviene perché è più compatta e soprattutto perché consente di ridurre il numero di istruzioni
Questa distinzione non è importante quando li utilizziamo singolarmente. La distinzione è particolarmente significativa quando gli operatori di incremento e decremento sono usati in espressioni che coinvolgono altri operatori.
Esempio a lato.
a) k = 8 e i = ++k
quanto valgono k ed i ?
b) k = 8 e i = k++
quanto valgono k ed i ?
Si veda l’esercizio 5.1
Il C++ esercita un forte controllo sui tipi e dà messaggio di errore quando si tenta di eseguire operazioni fra operandi di tipo non ammesso
Durante l’esecuzione di un programma ci sono situazioni in cui viene cambiato il tipo di dato (casting implicito):
Ciò può provocare degli errori difficilmente individuabili.
I quattro operatori matematici si applicano a qualsiasi tipo standard, ma i tipi dei due operandi devono essere uguali.
Nel caso di due tipi diversi, il compilatore esegue una conversione di tipo implicita su uno dei due operandi
… seguendo la regola di promuovere il tipo più semplice (meno ampio in bytes) a quello più complesso (più ampio in bytes),
… secondo la seguente gerarchia (in ordine crescente di complessità):
bool → char → unsigned char → short → unsigned short → long → unsigned long → float → double → long double
Esempio: 3.4/2 il secondo operando è trasformato in 2.0 e il risultato è correttamente 1.7
Nelle assegnazioni, il tipo dell’operando di destra viene sempre convertito implicitamente nel tipo dell’operando di sinistra.
Se il tipo dell’espressione ha una precisione minore del tipo della variabile, come in
Variabile-double = espressione-float
allora non c’è alcun problema; se, invece, accade il contrario, come in
Variabile-float = espressione-double
potrebbero nascere due tipi di problemi:
Esempio:
int c;
double d;
c = d (warning in fase di compilazione)
Nelle operazioni fra tipi interi, se il valore ottenuto esce dal range (overflow), l’errore non viene segnalato.
Anche il casting implicito può generare un overflow che non viene segnalato come errore.
Es. short n = 32767;
n++; (l’errore non viene segnalato, ma in n si ritrova il numero -32768)
È bene non adoperare espressioni in cui sono presenti variabili di tipo diverso.
Se n1 ed n2 sono variabili di tipo int , r una variabile di tipo float e c una variabile di tipo char, dire cosa stampa il computer allorché esegue le seguenti istruzioni:
n1= 11;
n2=3 ;
cout<<n1*n2>>;
c=’H';
n2=n1%n2;
cout<<c<<endl<<n2;
r=n1/n2;
n1=n1/n2;
cout<<n1<<endl<<r;
Scrivere un programma completo che esegua questa sequenza di istruzioni.
L’operatore di casting (o di conversione esplicita), serve per forzare una conversione di tipo (ha due operandi)
in C++ equivale a:
(tipo) variabile
tipo (variabile)
static_cast <tipo> (variabile)
consiste nell’indicazione del nuovo tipo fra parentesi davanti al nome della variabile da trasformare.
Tutti i tipi standard consentono il casting
Esempio: float (n) % 3 é errato in quanto l’operatore % ammette solo operandi interi.
Esempio:
int i=32;
cout<< (char) i << ” ha codice “<< i<<endl;
l’intero i viene convertito in modo esplicito a carattere.
Supponiamo che a e b siano due numeri interi; allora l’istruzione
if ((a==0) && (b==0))
cout<<” a e b sono entrambi nulli”;
scrive ‘a e b sono entrambi nulli’ soltanto se è vero che sia il valore contenuto in a che quello contenuto in b sono nulli; l’istruzione
if ((a==0) || (b==0))
cout<<”almeno uno dei due numeri a e b è nullo”;
dà la scritta ‘almeno uno dei due numeri a e b è nullo’ soltanto se almeno uno dei due numeri è uguale a 0.
È bene ricordare che le espressioni booleane semplici che compaiono in una espressione composta devono essere racchiuse tra parentesi tonde e che l’operatore di negazione ha la precedenza sugli altri due.
Due espressioni logiche si dicono equivalenti se esse assumono sempre lo stesso valore di verità, qualunque sia il valore di verità delle espressioni logiche semplici che la compongono.
Si noti che l’espressione booleana (A1) && (A2) && …&& (An) è valutata nel seguente modo:
Analogamente per l’espressione A1 || A2 || … || An
Ad esempio si può scrivere: if((a!=0) && (b/a<c)) …
Bisogna però fare attenzione:
l’espressione ((b/a<c)&&(a!=0)) pur essendo logicamente equivalente alla prima darebbe un errore a runtime se a fosse nullo perché cerca di dividere un numero per 0.
1. Prime nozioni di Programmazione
2. C++ elementi di un programma
3. Le istruzioni di I/O standard
5. C++ funzioni matematiche ed espressioni booleane
6. Le strutture di controllo - parte seconda
8. Array di caratteri e tipi astratti
9. Astrazione procedurale: Procedure e Funzioni
10. Astrazione procedurale: Procedure e Funzioni -parte seconda
11. Astrazione procedurale: Procedure e Funzioni - parte terza
12. Librerie
13. Le strutture di controllo - parte terza
14. Algoritmi
16. I File di testo
17. La classe string