PROGRAMMIAMO
C++ - Espressioni
Espressioni

Il significato del termine espressione in programmazione è simile a quello della matematica. Una espressione è un particolare tipo di assegnazione. In parole semplici si tratta di una formula in cui il risultato di un certo calcolo viene assegnato ad una variabile. Per esempio:

area_trapezio = (base_maggior+base_minore)*altezza/2;

Già dall'espressione precedente è possibile osservare che la notazione usata in C è leggermente diversa da quella usata in algebra. Un'espressione in generale contiene variabili, costanti numeriche e operatori aritmetici.

Operatori aritmetici (binari)

Gli operatori aritmetici in C sono i seguenti:

+ addizione
- sottrazione
* moltiplicazione
/ divisione
%modulo

Fra gli operatori valgono le regole di precedenza dell'algebra e precisamente: moltiplicazione, divisione e modulo hanno la precedenza su addizione e sottrazione.

Per modificare l'ordine di precedenza si usano le parentesi tonde, come nell'esempio dell'area del trapezio. Non si possono usare parentesi quadre o graffe. Se è necessario si possono usare più parentesi tonde annidate, come in questo esempio:

num = ((a+b)*5 + ris)/2;

 

Operatori unari

Oltre agli operatori precedenti (detti operatori binari in quanto si applicano sempre a una coppia di elementi) il C prevede anche i seguenti operatori unari (cioè che si applicano a un elemento solo):

- negazione (cambia il segno)
++ incremento
-- decremento

La negazione consente di ottenere un valore negativo di un numero. Ad esempio, -x è il valore negativo del valore numerico rappresentato dalla variabile x.

Gli operatori di incremento e decremento sono applicabili soltanto a variabili e consentono di ottenere un valore rispettivamente aumentato o diminuito di uno. È molto importante la posizione dell’operatore. Infatti, se l’operatore si trova a sinistra dell’operando, l’operazione di incremento o decremento viene eseguita prima della valutazione dell’espressione (preincrement), mentre se si trova a destra l’operazione viene eseguita dopo (postincrement). Chiariamo il concetto con un esempio:

x = 3;
y = ++x;

In questo caso la variabile x viene prima incrementata di uno e quindi il suo valore (4) viene assegnato a y. In questo caso alla fine sia x che y valgono 4.

Si consideri invece questo esempio:

x = 3;
y = x++;

In questo caso l'assegnazione viene eseguita prima dell'incremento e dunque alla fine x vale 4 e y vale 3.

Operatori di assegnazione composti

Un caso che si incontra molto frequentemente programmando è l'assegnazione di una variabile a se stessa, dopo averne modificato il valore. Abbiamo già affrontato l'argomento parlando di variabili di accumulo nella sezione dedicata agli algoritmi. Rivediamo qui rapidamente qualche esempio di questo tipo:

somma = somma + incremento;
diff = diff - num;
prodotto = prodotto * fattore;
ris = ris/10;

Il C consente di abbreviare la scrittura di queste assegnazioni nel seguente modo:

somma += incremento;               // equivale a somma = somma + incremento
diff -= num;                             // equivale a diff = diff - num
prodotto *= fattore;                 // equivale a prodotto = prodotto * fattore
ris /= 10;                                // equivale a ris = ris/10

Si tratta come si è detto di una notazione abbreviata: il suo uso, sebbene piuttosto frequente, non è in nessun caso obbligatorio né rende più veloce l'esecuzione del programma.

 

Divisione e troncamento

Utilizzando l'operatore di divisione (/) occorre tener presente che, se entrambi gli operandi sono di tipo int, anche il risultato è di tipo int. Questo fatto può produrre risultati indesiderati. Consideriamo la seguente assegnazione:

int numA, numB;
numA = 5;
numB = numA/2;

Il risultato assegnato a numB è ovviamente 2 e non 2.5: infatti la divisione fra due interi produce ancora un risultato intero. Si consideri tuttavia anche quest'altro caso:

int numA;
double numB;
numA = 5;
numB = numA/2;

Contrariamente a quanto forse ci si potrebbe aspettare, anche in questo caso alla fine numB conterrà il valore 2, o meglio 2.0 (dal momento che viene trasformata una costante double). Il motivo è che la divisione numA/2 viene calcolata fra una variabile int (numA) e una costante intera (2): di conseguenza, in base alle regole del linguaggio C, il risultato è ancora intero!

La soluzione in questi casi consiste nel promuovere uno dei due operandi al tipo superiore. In pratica si può fare così:

int numA;
double numB;
numA = 5;
numB = numA/2.0;

In questo modo la costante 2.0 è diventata double. Quando in un'operazione sono presenti due tipi differenti (int e double nel nostro caso) il C converte automaticamente il risultato nel tipo "superiore" (cioè da int a double).

Occorre prestare molta attenzione a possibili errori di questo tipo. Per esempio:

area_triangolo = 1/2*base*altezza;

In questo caso 1/2 è una divisione fra due costanti intere e dunque produce un risultato intero e cioè: zero! Infatti 0.5 viene troncato. Per evitare errori di questo genere (che non producono nessun messaggio di avvertimento dal compilatore!) bisogna promuovere a double almeno una delle due costanti:

area_triangolo = 1.0/2*base*altezza;

 

Modulo

L'operatore modulo (%) non è comunemente usato in algebra e perciò agli inizi presenta qualche difficoltà in più. Occorre anzitutto precisare che il modulo si può usare solo fra due variabili o costanti di tipo int (in caso di variabili o costanti double, l'uso del % produce un messaggio di errore in quanto è privo di senso).

Il modulo calcola il resto della divisione intera fra due numeri interi. Si consideri il seguente esempio:

int gatti:
int gatti_per_fila;
int resto;
gatti = 44:
gatti_per_fila = 6;
resto = gatti%gatti_per_fila

Al termine dell'esecuzione la variabile resto contiene il valore 2, in quanto 44 diviso 6 dà come risultato 7 col resto di 2. Si osservi che l'operatore % fornisce solo il resto della divisione e non il quoziente della divisione stessa (se si volesse anche il quoziente della divisione, bisognerebbe usare il /).

L'operatore % è molto più utile di quanto forse potrebbe sembrare. Per esempio viene usato per determinare se un numero è divisibile oppure no per un altro. Infatti se due numeri sono divisibili fra loro il resto della loro divisione è zero.

 

precedente - successiva

Sito realizzato in base al template offerto da

http://www.graphixmania.it