L’assegnazione dei valori alle variabili
L’assegnazione dei valori alle variabili
L’istruzione di assegnazione ha una sintassi del tipo:
variabile = valore;
Il valore viene assegnato alla variabile scritta a sinistra del simbolo =.
Per valore si intende un numero o il risultato di un’espressione.
Per esempio, il calcolo dell’area di un cerchio viene indicato con l’istruzione:
area = raggio * raggio * 3.14;
Nelle espressioni di tipo numerico si usano gli operatori aritmetici già visti +, –, *, /, per le quattro operazioni elementari e % per il resto della divisione tra interi.
Per esempio:
resto = a % b;
velocita = spazio / tempo;
Nei linguaggi di programmazione sono, in genere, consentite anche istruzioni del tipo:
conta = conta + 1;
con la variabile conta che compare sia a sinistra che a destra del segno =. La precedente istruzione significa che il nuovo valore di conta si ottiene aggiungendo 1 al precedente valore.
Nel linguaggio C si può anche scrivere:
conta++;
per indicare, con l’operatore ++, un incremento unitario del valore di una variabile.
Esiste anche l’operatore – – per il decremento unitario:
conta––;
che è equivalente all’istruzione di assegnazione:
conta = conta – 1;
Per incrementi e decrementi non unitari si possono usare gli operatori += e –=.
Per esempio, l’istruzione:
a += b;
significa che il valore di a + b viene memorizzato nella variabile a ed è equivalente all’istruzione di assegnazione:
a = a + b;
L’istruzione:
a –= b;
significa che il valore di a – b viene memorizzato nella variabile a ed è equivalente all’istruzione di assegnazione:
a = a – b;
Si possono usare in modo analogo anche gli operatori *=, /= e %= per la moltiplicazione, per la divisione e per il resto della divisione intera.
La tabella seguente riassume le equivalenze tra i vari operatori di assegnamento:
Operatore | Utilizzo | Esempio | Istruzione equivalente |
++ | Incremento unitario | x++ | x = x + 1 |
– – | Decremento unitario | x–– | x = x – 1 |
+= | Incremento | x += y | x = x + y |
–= | Decremento | x –= y | x = x – y |
*= | Moltiplicazione | x *= y | x = x * y |
/= | Divisione | x /= y | x = x / y |
%= | Resto della divisione intera | x %= y | x = x % y |
Nelle istruzioni di assegnazione e nelle espressioni di calcolo possono poi comparire le funzioni, ossia procedure di calcolo predefinite (built-in) del linguaggio che, ricevendo un valore, restituiscono un valore calcolato.
Tra le più usate, possono essere citate le seguenti:
- pow(x, y), per indicare il calcolo della potenza di x con esponente y (x e y devono essere di tipo double, così come il risultato ottenuto del calcolo);
- sqrt(x), per indicare il calcolo della radice quadrata del numero x;
- ceil(x), per indicare il valore di un numero arrotondato all’intero superiore;
- floor(x), per ottenere un numero senza parte decimale.
Le ultime due necessitano di un esempio chiarificatore:
ceil(3.7) produce 4;
floor(3.7) produce 3.
Per calcolare l’ipotenusa di un triangolo rettangolo, si può scrivere un’istruzione del tipo:
ipotenusa = sqrt(pow(cateto1,2.0) + pow(cateto2,2.0));
I numeri 2.0 come esponenti dei cateti stanno ad indicare che gli argomenti della funzione pow sono di tipo double.
Tutte le funzioni illustrate in precedenza appartengono alla libreria delle funzioni matematiche predefinite del linguaggio. Pertanto i programmi che usano queste funzioni devono contenere all’inizio la direttiva
#include <math.h>
per l’inclusione del file di intestazione math.h con i prototipi delle funzioni matematiche.
L’uso delle parentesi (sempre tonde) determina l’ordine di esecuzione delle operazioni indicate in un’espressione aritmetica, come nell’algebra elementare:
a = (b + c) * (d – e);
Si noti che nel linguaggio di programmazione non è possibile indicare le frazioni con la consueta notazione:
(a – b)²
x = ———
c * d
Questa frazione deve essere indicata in un’istruzione di assegnazione nel seguente modo:
x = pow((a-b),2.0)/(c*d);
Nelle istruzioni di assegnazione, occorre fare attenzione all’uso dei tipi per le variabili, considerando i problemi di incompatibilità tra tipi che si possono verificare.
Per esempio, se si hanno:
int a;
char c[10];
le istruzioni di assegnazione a = c e c = a rappresentano entrambe un errore di sintassi.
Questi tipi di errore vengono segnalati con un messaggio di incompatibilità di tipi (in inglese, incompatibile types in assignment).
Il casting per la conversione di tipo
Per conversione di tipo si intende un’operazione che trasforma un valore di un certo tipo in un valore di altro tipo.
Questa operazione è molto comune in tutti i linguaggi, anche se spesso il programmatore non se ne rende conto. Per esempio, quando in un’espressione si utilizzano dati dello stesso tipo, il tipo del risultato di calcolo è ben definito ed è lo stesso degli operandi. Il problema nasce quando in un’operazione gli operandi sono di diverso tipo.
Per esempio, nel calcolo dell’area del seguente frammento di codice, si tratta di decidere di che tipo sia il valore della variabile area:
int base;
float altezza;
area = base * altezza;
Non sempre una conversione di tipo preserva il valore: per esempio nella conversione da float a int in generale si riscontra una perdita di precisione. In effetti in una conversione da float a int il compilatore non fa altro che scartare la parte frazionaria; se poi il valore non è rappresentabile dal tipo int il risultato è indefinito.
È opportuno sottolineare che le operazioni di conversione riguardano il valore della variabile in quel particolare contesto e non il tipo della variabile stessa.
Le conversioni eseguite direttamente dal compilatore si chiamano conversioni implicite.
Per esempio, si consideri il programma seguente nel quale un valore non intero viene assegnato ad una variabile di tipo int.
#include <stdio.h>
main()
{
int a = 5;
float b = 3.56;
a = b;
printf(“%d”,a);
}
L’output del programma è 3.
Nel seguente programma, invece, un valore intero è assegnato ad una variabile di tipo float.
#include <stdio.h>
main()
{
int a = 5;
float b = 3.56;
b = a;
printf(“%f”,b);
}
In questo caso l’output del programma è 5.0.
I caratteri %f nell’istruzione printf indicano lo specificatore di formato per i numeri reali (float).
Il linguaggio C consente al programmatore stesso di richiedere le conversioni di tipo: in questo caso si parla di conversioni esplicite (cioè decise dal programmatore) o casting.
Il casting è l’azione che consente di trasformare la rappresentazione di un dato dal suo tipo originale a un altro.
L’operatore cast, rappresentato da una coppia di parentesi tonde che racchiudono il tipo di dato, è un operatore a tutti gli effetti e ha la seguente sintassi:
(tipo) espressione;
Per esempio:
b = (int) a;
I due programmi seguenti evidenziano l’importanza del casting nelle operazioni con numeri
di tipo diverso.
#include <stdio.h>
main()
{
int a = 5;
int b = 2;
float c = 3.56;
float p;
p = a/b + c;
printf(“%f”,p);
}
#include <stdio.h>
main()
{
int a = 5;
int b = 2;
float c = 3.56;
float p;
p = (float)a/b + c;
printf(“%f”,p);
}
Con il primo programma si ottiene in output 5.56, perché la divisione intera a/b produce il valore 2 che viene poi sommato a 3.56.
Con il secondo programma si ottiene invece in output il valore 6.06, perché il casting, applicato alla divisione a/b, produce correttamente il valore 2.5 che viene poi sommato a 3.56.
Commento all'articolo