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

Contenuto cancellato Contenuto aggiunto
m -iw migrati a Wikidata
Nessun oggetto della modifica
Etichetta: Editor wikitesto 2017
 
Riga 19:
Per essere usata una variabile va prima {{IndexItem|variabili, dichiarazione}}dichiarata. La dichiarazione è la seguente:
 
<sourcesyntaxhighlight lang="c">
tipo nome_variabile;
</syntaxhighlight>
</source>
 
che dichiara una variabile il cui nome è <code>nome_variabile</code> e il cui tipo è <code>tipo</code>. Per esempio se vogliamo dichiarare una variabile di {{IndexItem|intero}}tipo intero possiamo farlo nel seguente modo:
 
<sourcesyntaxhighlight lang="c">
int numero;
</syntaxhighlight>
</source>
 
dove {{IndexItem|int}}<code>int</code> è un tipo di variabile usato per rappresentare i numeri interi.
Riga 33:
È possibile dichiarare più variabili dello stesso tipo su una sola riga, per esempio:
 
<sourcesyntaxhighlight lang="c">
int a, b;
</syntaxhighlight>
</source>
 
dichiara due variabili di tipo <code>int</code>.
Riga 41:
Le variabili possono essere {{IndexItem|variabili, inizializzazione}}inizializzate durante la dichiarazione:
 
<sourcesyntaxhighlight lang="c">
int c = 1;
</syntaxhighlight>
</source>
 
se non si inizializza una variabile si dice che il suo valore è indeterminato, nel senso che non si può dire che cosa contenga. Tipicamente una variabile non inizializzata contiene {{IndexItem|garbage}}''garbage'', spazzatura, cioè contiene quello che è presente nel suo indirizzo al momento dell'allocazione. Alcuni {{IndexItem|compilatore}}compilatori azzerano le variabili appena dichiarate. Poiché il comportamento del compilatore in genere non è noto, e poiché il nostro programma dovrà essere compatibile col maggior numero di compilatori, il programma dovrà inizializzare le variabili prima dell'uso. Se si dichiarano più variabili sulla stessa riga possono essere o meno inizializzate:
 
<sourcesyntaxhighlight lang="c">
int d, e = 2;
</syntaxhighlight>
</source>
 
che crea due variabili, ma solo la seconda è inizializzata
 
<sourcesyntaxhighlight lang="c">
int f = 1, g = 2;
</syntaxhighlight>
</source>
 
tutte e due sono inizializzate.
 
esiste anche la possibilità di effettuare una dichiarazione concatenata:
<sourcesyntaxhighlight lang="c">
int a=b=3;
</syntaxhighlight>
</source>
entrambe le variabili vengono inizializzate al valore 3
==={{IndexItem|variabili, nomi}}Nomi di variabili===
Riga 75:
 
Il numero di caratteri significativi indica quanti caratteri iniziali, nel nome, possono essere uguali, prima che intervenga un conflitto di similitudine
<sourcesyntaxhighlight lang="C">
int abcdefghijklmnopqrstuvwxyzABCDEaaa;
int abcdefghijklmnopqrstuvwxyzABCDEbbb; /* Possibile conflitto con la precedente! */
</syntaxhighlight>
</source>
Nel caso sopra vengono definite due variabili, i cui primi 31 caratteri del nome sono uguali: questo può impedire al compilatore di distinguerle fra loro, generando un errore.
 
Riga 89:
Con {{IndexItem|operatore uguale}}l'operatore di assegnazione <code>=</code> si assegna ad una variabile un particolare valore:
 
<sourcesyntaxhighlight lang="c">
int a;
a = 1;
</syntaxhighlight>
</source>
 
la variabile a è dichiarata di tipo intero e successivamente gli viene assegnato il valore 1. Ad una variabile può essere assegnato il valore di un'altra variabile:
 
<sourcesyntaxhighlight lang="c">
int b,c = 0;
b = c;
</syntaxhighlight>
</source>
 
entrambe le variabili valgono 0.
Riga 105:
L'assegnamento può essere fatto anche per più variabili contemporaneamente:
 
<sourcesyntaxhighlight lang="c">
int x,y;
x = y = 2;
</syntaxhighlight>
</source>
Ad entrambe le variabili viene assegnato il valore 2.
Riga 130:
==Esempi d'uso==
 
<sourcesyntaxhighlight lang="c">
#include <stdio.h>
int main(void)
Riga 148:
carattere = 'b';
}
</syntaxhighlight>
</source>
 
==Opzioni==
Riga 160:
Inoltre le variabili <code>const</code> sono anche usate come parametri delle {{IndexItem|funzione}}[[C/Blocchi e funzioni/Funzioni|funzioni]] per assicurarsi che all'interno della funzione il valore di una variabile non possa subire variazioni.
 
<sourcesyntaxhighlight lang="c">
const int dieci = 10;
printf("Il numero è %d", dieci);
</syntaxhighlight>
</source>
 
Si possono anche dichiarare puntatori costanti. La cosa interessante è come varia il comportamento del puntatore a seconda che il modificatore const venga prima o dopo l'asterisco (*). Nella fattispecie se viene prima, il puntatore non potrà modificare l'area di memoria ma potrà spostarsi liberamente su di essa, se viene dopo potrà modificare l'area di memoria ma non potrà spostarsi, comportandosi come un array (dichiarato con le []).
Riga 175:
L'opzione <code>volatile</code> elimina tale certezza, costringendo di fatto il compilatore a produrre codice che rilegge il valore della variabile dalla memoria per ogni accesso in lettura, non essendovi garanzia che questo sia, nel frattempo, rimasto inalterato.
 
<sourcesyntaxhighlight lang="c">
volatile int laMiaVariabile=14;
</syntaxhighlight>
</source>
 
==={{IndexItem|static}}static===
Riga 200:
La definizione <code>extern</code> ha lo scopo d'informare il compilatore che ogni riferimento alla variabile dovrà essere predisposto e infine risolto solo nella fase finale di [[w:linking|linking]].
 
<sourcesyntaxhighlight lang="C">
extern int n; /* Uso interno al modulo, definizione esterna */
</syntaxhighlight>
</source>
 
==={{IndexItem|register}}register===
Lo specificatore <code>register</code> indica che l'uso di una variabile è critico per il tempo di esecuzione del programma: il suo accesso dovrà quindi essere più veloce possibile, con la memorizzazione diretta in un registro della {{IndexItem|CPU}}[[w:CPU|CPU]] o tramite altri metodi in grado di velocizzarne l'accesso. Questo comando potrebbe essere ignorato dal compilatore se non vi sono registri liberi nella CPU (nel contesto di esecuzione in cui la variabile è visibile), oppure se i registri liberi non sono di dimensioni sufficienti a contenere il tipo di dato.
 
<sourcesyntaxhighlight lang="c">
register int i = 1;
for (i=1; i<=10; i++)
printf("Il numero è %d \n", i);
</syntaxhighlight>
</source>
 
Va osservato che nei compilatori moderni, dove l'uso delle risorse di CPU è generalmente reso al meglio, l'uso di questo specificatore è spesso ridondante.
Riga 219:
 
Ad esempio, con
<sourcesyntaxhighlight lang="C">
long int a;
long b;
</syntaxhighlight>
</source>
le due variabili hanno le stesse dimensioni, come spazio di memorizzazione (fino al doppio delle dimensioni del tipo <code>int</code>, potendo rappresentare quindi una gamma di valori più ampia).
 
Riga 228:
 
Alcune implementazioni permettono la doppia specificazione <code>long</code>, aumentando ancora la dimensione di alcuni tipi di dato, per esempio:
<sourcesyntaxhighlight lang="C">
long long foo; /* Variabile a 64 bit */
</syntaxhighlight>
</source>
 
==={{IndexItem|short}}short===
Riga 236:
 
Ad esempio, nel caso
<sourcesyntaxhighlight lang="C">
short int a;
short b;
</syntaxhighlight>
</source>
le due variabili hanno le stesse dimensioni, in modo analogo alle considerazioni per lo specificatore <code>long</code>.
 
Riga 246:
 
Ad esempio, nel caso
<sourcesyntaxhighlight lang="C">
int a;
signed int b;
signed c;
</syntaxhighlight>
</source>
le tre variabili hanno dimensioni e funzionalità equivalenti (il tipo <code>int</code> viene già trattato con segno aritmetico).
 
Riga 257:
 
Ad esempio, nel caso
<sourcesyntaxhighlight lang="C">
unsigned int a;
unsigned b;
</syntaxhighlight>
</source>
le due variabili hanno dimensioni e funzionalità equivalenti.