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:
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.
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:
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:
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:
In questo caso l'assegnazione viene eseguita prima dell'incremento e dunque alla fine x vale 4 e y vale 3.
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:
Il C consente di abbreviare la scrittura di queste assegnazioni nel seguente modo:
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.
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:
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:
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ì:
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:
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:
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:
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.
Sito realizzato in base al template offerto da
http://www.graphixmania.it