Corso di C con Linux

Espressioni, variabili e istruzioni

 

Un'espressione è composta da operandi e operatori.
All'interno di un'espressione non possono essere usate parole chiave; ad es. non è lecito scrivere:

c = auto + 2;

Ecco alcuni esempi di espressioni lecite:

1) 2 + 3
2) d + z
3) b < a
4) 300
5) b = c + a

Omettiamo di discutere i primi quattro esempi, che sono banali somme, confronti o valori costanti e passiamo al quinto.
Tale esempio significa: "Prendi il contenuto della variabile c, prendi il contenuto della variabile a, sommali e poni il risultato nella variabile b".
Per capire quanto appena detto occorre la seguente definizione:

Una variabile è una locazione di memoria, ove si possono scrivere e/o leggere dati.

In C una variabile viene rappresentata mediante un identificatore alfanumerico.
Nel seguente esempio, a è una variabile cui assegniamo il valore 10:
  
a = 10;

Una variabile è costituita da tre parti:
- il nome;
- il valore;
- l’indirizzo.
Per assegnare il nome ad una variabile occorre dichiararla, cioè dire al compilatore C (v. lezione 2) di riservare uno spazio di memoria per contenerla.
Il compilatore si occuperà di cercare un’area libera di memoria da assegnare alla variabile; quest’area si trova ad un determinato indirizzo.
Per leggere il valore della variabile possiamo utilizzare sia il nome che il suo indirizzo in memoria, ma per il momento utilizzeremo solo la prima possibilità.

Avviamo emacs:

$ emacs

e scriviamo il seguente esempio:

#include <stdio.h>

main()
{
  int a = 10;

  printf("Valore di a     = %d\n", a);
  printf("Indirizzo di a  = %x\n", &a);
  printf("Dimensione di a = %u byte\n", sizeof(a));

  exit(0);
}


Salviamolo col nome var.c, compiliamolo con il comando:

$ gcc –o var var.c

ed eseguiamolo:

$ ./var

L’output che si ottiene è  del tipo:

Valore di a     = 10
Indirizzo di a  = bffff8d8
Dimensione di a = 4 byte


Tralasciando il significato di alcune istruzioni che impareremo a conoscere nel seguito, il programma stampa il valore di a, che è quello che abbiamo assegnato noi stessi, l'indirizzo di memoria (in notazione esadecimale) nel quale la variabile è memorizzata e la sua dimensione, cioè il numero di byte che il compilatore ha riservato ad a.
Si noti che, poiché l’indirizzo di a è assegnato dal compilatore e dipende dallo stato della macchina (quantità di memoria, numero di processi caricati in memoria, etc.), il valore ottenuto in fase di esecuzione varia da macchina a macchina e anche tra due diverse esecuzioni del programma sulla stessa macchina.
Quello che per il momento è importante sottolineare è il fatto che le variabile non sono altro che contenitori per i dati.

Un'istruzione è un comando C completo.
Tutte le istruzioni terminano con il carattere ";", ad es.:

a = 1000;
c = 1;
b = a + c;


Supponendo che il compilatore abbia memorizzato le tre variabili in celle di memoria consecutive, il loro contenuto è  il seguente:

a | 1000 |
b | 1001 |
c |    1 |


Le istruzioni possono essere raggruppate in blocchi.
I blocchi di istruzioni sono compresi tra un carattere di inizio '{' e uno di fine '}', ad es.:

if (a < b) {
            c = a * b;
            a = a + 1;
           }


In questo esempio il blocco di istruzioni è quello che segue la parola chiave if, ovvero:

c = a * b;
a = a + 1;

Il significato di questa porzione di codice C è: "Se il valore (il contenuto) della variabile a è  minore di quello della variabile b, allora poni nella variabile c il valore di a moltiplicato per quello di b, ed aumenta il valore della variabile a di 1".
Le parentesi graffe servono a segnalare al compilatore di trattare tutte le istruzioni del blocco come un’unica entità, cioè come se fossero un’unica istruzione semplice.
I blocchi possono anche essere annidati, cioè avere porzioni di codice del tipo:

while (1) {
    b = c + 1;
    if (a < b) {
         b = a + 1;
    }
}


Nella lezione successiva impareremo a conoscere le funzioni e i blocchi di funzione.

 

Torna all'indice Generale del corso di Corso di C con Linux di Software Planet