C/Variabili, operatori e costanti/Costanti: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
G4 (discussione | contributi)
Nessun oggetto della modifica
Riga 3:
{{IndexItem|costanti}}
 
Esistono due tipi di costanti: le costanti manifeste e le variabili costanti.
Le '''costanti''' vengono definite con la {{IndexItem|direttiva}}[[C/Compilatore e precompilatore/Direttive|direttiva]] {{IndexItem|define}}<tt>#define</tt>:
 
== Costanti manifeste==
Le costanti manifeste si dichiarano nel seguente modo:
#define macro [sequenza_di_caratteri]
Ciò che si ottiene è la sostituzione nel sorgente del nome indicato con la sequenza di caratteri che lo segue. Si osservi l'esempio seguente:
<source lang="c">
#define identificatoreSALUTO valoreCiao! Come stai?
</source>
In questo caso viene dichiarata la costante SALUTO in modo tale che tutte le occorrenze di questo nome, successive alla sua dichiarazione, vengano sostituite con Ciao! Come stai?. È molto importante comprendere questo particolare: tutto ciò che appare dopo il nome della macro, a parte lo spazio che lo separa, viene utilizzato nella sostituzione. Ecco un esempio:
<source lang="c">
#include <stdio.h>
#define SALUTO "Ciao! come stai?\n"
int main (void)
{
printf (SALUTO);
return 0;
}
</source>
In questo caso, SALUTO può essere utilizzata in un contesto in cui ci si attende una stringa letterale, perché include gli apici doppi che sono necessari per questo scopo. Nell'esempio si vede l'uso della macro-variabile come argomento della funzione printf() e l'effetto del programma è quello di mostrare il messaggio seguente:
Ciao! come stai?
È bene precisare che la sostituzione delle macro-variabili non avviene se i loro nomi appaiono tra apici doppi, ovvero all'interno di stringhe letterali. Si osservi l'esempio seguente:
<source lang="c">
#include <stdio.h>
#define SALUTO Ciao! come stai?
int main (void)
{
printf ("%dSALUTO\n", VERO);
return 0;
}
</source>
In questo caso, la funzione printf() emette effettivamente la parola SALUTO e non avviene alcuna espansione di macro:
SALUTO
Una volta compreso il meccanismo basilare della direttiva #define si può osservare che questa può essere utilizzata in modo più complesso, facendo anche riferimento ad altre macro già definite:
 
#define VEROUNO 1
L'identificatore scelto dal programmatore permette di gestire con più facilità i numeri magici/costanti che verranno usati nel codice.
#define DUE UNO+UNO
#define TRE DUE+UNO
 
In presenza di una situazione come questa, utilizzando la macro TRE, si ottiene prima la sostituzione con DUE+UNO, quindi con UNO+UNO+1, infine con 1+1+1 (dopo, tocca al compilatore).
Semplicemente con questa direttiva ogni identificatore che viene trovato nel sorgente, viene sostituito con il suo valore.
 
Tradizionalmente i nomi delle costanti manifeste vengono definiti utilizzando solo lettere maiuscole, in modo da poterli distinguere facilmente nel sorgente.
Il valore definito dalla costante può essere un tipo di dato <code>int</code>, <code>char</code> o <code>stringa</code>.
 
Esempio:
 
Come è possibile vedere meglio in seguito, è sensato anche dichiarare una macro senza alcuna corrispondenza.
Nella definizione di una macro-variabile può apparire l'operatore ##, con lo scopo di attaccare ciò che si trova alle sue estremità. Si osservi l'esempio seguente:
<source lang="c">
#include <stdio.h>
#define VERO 1
#define UNITO 123 ## 456
/* ... */
int main (void)
printf("%d\n", VERO);
{
printf ("%d\n", UNITO);
return 0;
}
</source>
 
Le costanti non vengono allocate in memoria, vengono valutate in fase di {{IndexItem|compilazione}}compilazione, ed il {{IndexItem|preprocessore}}[[C/Compilatore e precompilatore/Direttive|preprocessore]] si occuperà di sostituire ogni occorrenza 'identificatore' con il suo 'valore' definito.
 
L'utilizzo delle costanti, permette una maggiore leggibilità e agevolezza nella fase di manutenzione del codice.
 
È però preferibile l'uso di {{IndexItem|const}}<tt>[[C/Variabili%2C_operatori_e_costanti/Variabili#const|const]]</tt> per dichiarare costanti.
 
[[Categoria:C|Costanti]]
{{Avanzamento|75%}}