Guida [VECCHIO CORSO]Corso programmazione linguaggio C - Lezione #4 : Data types,variabili e typedef

giovy2707

Utente Electrum
27 Giugno 2019
96
38
62
103
Ultima modifica:
LEZIONE X IMMAGINE.png


LEGGI QUESTO PRIMA DI CONTINUARE

Se non hai già letto le avvertenze/istruzioni presenti nella LEZIONE 1 ti invito a leggerle (puoi farlo da questo link: Lezione 1 ) , ho evitato di fare copia e incolla delle varie avvertenze/istruzioni poiché mi sembrava inutile aggiungere a ogni post tutto quel testo.

FILE ZIP DEL CORSO :

Vedi: https://drive.google.com/file/d/1sPuNna2S3b0sqmFHK448j4vKg1MVUlSM/view?usp=sharing



NOTA PER I LETTORI: Mi spiace per ever pubblicato questa lezione un pò in ritardo però alla fine eccola qui, vi anticipo che la quantità di informazioni è parecchio grossa, e di conseguenza non escludo possibili errori e/o imprecisioni, ovviamente sarà mia premura rivedere e aggiornare questa lezione nei prossimi giorni: aggiungendo eventuali informazioni e ascoltando come sempre i consigli degli utenti più esperti che già si sono rivelati di grande aiuto nel segnalare errori e imprecisioni nelle altre lezioni. Alcune cose dovete prenderle così come sono (come la "printf") ma non dovete preoccuparvi perché nella prossima lezione spiegherò tutto, per il momento è importante che voi capiate la teoria e poi passeremo alla pratica vera e propria. In questa lezione non evidenzierò in verde le parole chiave perché ci vorrebbe troppo tempo (ovviamente i PDF e i file su obsidian sono evidenziati), però non escludo di evidenziare poco alla volta la lezione nei prossimi giorni.

1- Data types


Un data type è un attributo che viene applicato ai dati che permette al programmatore e al computer di capire in che modo essi vanno interpretati.

1665672571713.png


1665672621376.png


In C abbiamo due tipi di data types:
  1. Object types(che rappresentano i dati)
    • Basic types (tipi di dato base).

    • Derived types (tipi creati a partire dai Basic types, appunto dei derivati).
  2. Function types (per le funzioni).
I data-types vengono usati principalmente quando usiamo le variabili o le funzioni (parleremo delle funzioni più avanti).

2 - Variabili


Una variabile è uno spazio di memoria (memoria RAM), che può contenere un valore di un certo tipo (data-type) , e a cui possiamo assegnare un nome identificativo, il nome della variabile non potrà essere cambiato, mentre il valore contenuto dalla variabile si , mantenendo però costante il tipo.


2.1 - Il nome di una variabile


Il nome di una variable ("identificatore") per essere assegnato ad una variabile deve rispettare una serie di regole:
  1. Un identificatore può essere formato da:
    • lettere maiuscole

    • lettere minuscole

    • numeri da 0 a 9

    • simbolo _ (underscore)
  2. Un identificatore non può avere come primo carattere del nome un numero.

  3. Non può avere come nome una keyword (parola chiave) predefinita del linguaggio.

  4. Il C è case-sensitive (una parola scritta con lettere maiuscole è diversa da una con lettere minuscole, es: "Casa" e "casa" sono considerate parole diverse).

2.2 - Dichiarazione di una variabile


Quando vogliamo usare una variabile dobbiamo prima dichiararla, per dichiarare una variabile si fa così:

C:
data-type identificatore;

//esempio:

int nome_variabile;

dove:

Codice:
data-type -> int (valore numerico intero)
identificatore -> nome_variabile

possiamo anche dichiarare più variabili in una singola istruzione:

C:
int var1,var2,var3;

/*
In questo caso abbiamo dichiarato 3 variabili:
- var1
- var2
- var3
*/

quando dichiariamo una variabile, chiediamo al compilatore di riservare ad essa uno spazio di memoria più o meno grande in base al tipo di essa.


2.3 - Inizializzazione delle variabili


Oltre a poter dichiarare le variabili possiamo richiedere al compilatore anche di assegnare loro un valore, quindi di "allocare" nella memoria riservata (assegnata alla variabile durante la sua dichiarazione) tale valore.


Dizionario:

Allocare

Destinare, assegnare, stanziare: delle risorse, decidere di farne un certo uso.
  • In informatica, riservare una parte della memoria principale al calcolo di una variabile per mezzo del sistema operativo.
Fonte: GOOGLE


Questa azione è detta inizializzazione della variabile.
Possiamo inizializzare una variabile in più modi:

  • Inizializziamo e dichiariamo con un'unica istruzione:
C:
data_type nome_variabile = valore;
//esempio:

int var1 = 10;

  • Inizializziamo la variabile dopo la dichiarazione:

C:
variabile = valore;

//esempio
 
var1 = 10;

  • Inizializziamo più variabili in una sola istruzione:

Codice:
variabile1 = valore1, variabile2 = valore2, variabile3 = valore3;

//esempio

var1 = 10,var2 = 20, var3 = 30;

  • Inizializziamo e dichiariamo con un'unica istruzione più variabili:
C:
int variabile1 = valore1, variabile2 = valore2, variabile3 = valore3;


//esempio


int var1 = 10,var2 = 20, var3 = 30;

1665673637922.png


Per spiegare cosa accade durante l'inizializzazione di una variabile facciamo un esempio:
  • vogliamo dichiarare una variabile di tipo int e la chiamiamo "my_var", poi assegniamo alla variabile "my_var" il valore 120.
Quello che accadrà sarà:
  1. Al momento della dichiarazione il compilatore riserverà uno spazio di memoria abbastanza grande da contenere un dato di tipo int (4 byte/32 bit) e assegnerà a questa area di memoria il nome my_var.

  2. Quando inizializziamo la variabile assegnandogli il valore 120 ,verrà allocato nello spazio di memoria corrispondente alla variabile my_var la codifica binaria di 120.
1665673733186.png


Possiamo assegnare ad una variabile anche il risultato di un'operazione aritmetica o il "valore di ritorno di una funzione" (di cui parleremo in seguito).

C:
int a = 120 + 10;
int b = funzione();


2.4 - Variabili costanti


Quando dichiariamo una variabile e assegniamo ad essa un valore, possiamo cambiare il valore contenuto nella variabile in un secondo momento tramite un'altra assegnazione:

C:
//Dichiarazione e inizializzazione della variabile:

int a = 10;

//Assegnamento di un nuovo valore alla variabile:

a = 20;

Se questo è vero per una variabile, non è invece lo stesso quando si parla di costanti. Una costante si dichiara proprio come una variabile, anteponendo però la parola chiave "const" davanti al data-type della costante:

C:
//dichiarazione variabile normale:

data-type nome_variabile;

//dichiarazione costante:

const data-type nome_variabile;

come possiamo vedere a livello di dichiarazione la sintassi è quasi identica ad una classica dichiarazione, si aggiunge solamente la parola chiave const.

1665673991280.png


  1. Una volta dichiarata e inizializzata una costante non è possibile cambiare il valore assegnatogli.
C:
//Proviamo a modificare il valore della costante dopo la sua inizializzazione:

const int costante = 20;

costante = 30; //ERRORE DI COMPILAZIONE

  1. Dichiarazione e inizializzazione devono avvenire nella stessa istruzione:
C:
//Metodo corretto
   const int costante1 = 20;
 
//Metodo errato :
   const int costante; //ERRORE DI COMPILAZIONE
   constante = 20; //ERRORE DI COMPILAZIONE

1665674086674.png


Accade qualcosa di simile a quello che accade durante la dichiarazione e inizializzazione di una variabile classica, tuttavia in questo caso l'area di memoria che ospiterà la nostra costante sarà read-only cioè non saranno permesse operazioni di scrittura su di essa, ma solo di lettura.


3 - Int


Iniziamo a conoscere i primi data-types di tipo basic types, e iniziamo vedendo il data-type int. Il tipo int serve a dichiarare variabili che possono contenere valori numerici interi (quindi non sono ammessi numeri con la virgola).

Tali valori numerici potranno essere positivi o negativi. Il tipo int può essere anche usato come "signed int" anche se non cambia nulla (il "signed" sta ad indicare che i valori sono con segno), di solito si usa int in quanto è uguale a signed int.

C:
//Dichiarazione variabile con data-type int:

int variabile;

signed int variabile; //il significato è lo stesso

La quantità di memoria per una variabile di tipo int è generalmente di:
  • 64 bit (8 byte)
oppure
  • 32 bit (4 byte) <-- su GCC 64 bit è generalmente questa
oppure
  • 16 bit (2 byte)
essa può variare a seconda di:
  • Eventuali istruzioni date al compilatore (che per il momento non vedremo)

  • Versione e tipo del compilatore

  • Tipo di hardware del computer

  • Sistema operativo in uso
Nel mio caso, e forse anche il vostro, è di 32 bit (4 byte).

1665674226204.png

1665674247178.png

1665674271792.png

1665674290136.png


Il motivo per cui ci interessa la grandezza della memoria assegnata alla variabile è che al variare di essa cambia anche il numero massimo che essa può contenere (ti ricordo che un numero salvato in una variabile è convertito in binario usando la tecnica del complemento a 2).

1665674317817.png



3.1 - Modificatori di int:

3.1.1 - Unsigned int


Come abbiamo detto il tipo int può accettare valori sia positivi che negativi, tuttavia ciò limita il numero di valori rappresentabili infatti per rappresentare i valori positivi e negativi si usa la tecnica del complemento a 2 , questa limitazione è però superflua quando abbiamo la certezza che non utilizzeremo numeri negativi.
In questi casi ci viene in aiuto il tipo "unsigned int" che altro non è che un int che però accetta solo valori positivi. Non utilizzando valori negativi abbiamo il massimo dello spazio utilizzabile.

C:
unsigned int variabile;

1665674418340.png



3.1.2 - Short int


Se sappiamo che NON utilizzeremo valori troppo grandi allora è possibile usare una variabile con meno bit a disposizione in modo da risparmiare memoria, per farlo ci basta dichiarare la variabile con il tipo "short int".

1665674485538.png


C:
short int variabile;

è possibile anche omettere la parola "int" e scrivere solamente "short" il significato sarà lo stesso.

C:
short variabile; //equivalente a short int


3.1.3 - Unsigned short int


Anche per il tipo "short int" esiste una variante che ammette solo valori positivi, questa variante dello short int è utilizzabile inserendo la parola chiave "unsigned" davanti al tipo della variabile:

Codice:
unsigned short int variabile;

//oppure

unsigned short variabile;


3.1.4 - Long int:


Se sappiamo che utilizzeremo valori troppo grandi per un normale int allora è possibile usare una variabile con più bit a disposizione, per farlo ci basta dichiarare la variabile con il tipo "long int".

C:
long int variabile;

//oppure

long variabile; //equivalente a short int

Una "long int" ha generalmente il doppio dei bit di una int a disposizione.


3.1.5 - Unsigned long int:


Anche per il tipo long int esiste una variante che ammette solo valori positivi, questa variante del long int è utilizzabile inserendo la parola chiave "unsigned" davanti al tipo della variabile:

C:
unsigned long int variabile;

//oppure

unsigned long variabile;


3.1.6 - Long long int:


Se sappiamo che utilizzeremo valori troppo grandi anche per un long int allora è possibile usare una variabile con ancora più bit a disposizione, per farlo ci basta dichiarare la variabile con il tipo long long int.

C:
long long int variabile;

è possibile anche omettere la parola "int" e scrivere solamente "long long" il significato sarà lo stesso.

C:
long long variabile; //equivalente a long long int

1665675016232.png


LINK:


3.1.7 - Unsigned long long int:


Anche per il tipo long long int esiste una variante che ammette solo valori positivi, questa variante del long long int è utilizzabile inserendo la parola chiave "unsigned" davanti al tipo della variabile:

Codice:
unsigned long long int variabile;

//oppure

unsigned long long variabile;

1665675118380.png



3.2 - Literal interi


Per "literal interi" ci riferiamo ai "valori letterali" che possiamo utilizzare per rappresentare i nostri dati di tipo int.

1665675181053.png


Volendo possiamo salvare un numero in una variabile anche senza usare per forza il sistema di numerazione decimale.

1665675206905.png


Possiamo usare i seguenti tipi di literal:
  • Decimali:
    • Cifre da 0 a 9 .
  • Ottali:
    • Cifre da 0 a 7 .

    • Lo 0 deve essere messo all'inizio del numero.
  • Esadecimali:
    • Cifre da 0 a 9 e caratteri da A a F

    • Lo 0 e la "X" (nella forma "0x... ") devono essere messi all'inizio del numero (la "X" e le lettere che compongono il numero possono essere maiuscole o minuscole).
  • Binari:
    • Cifre da 0 a 1 .

    • Lo 0 e la "B" (nella forma "0b... ") devono essere messi all'inizio del numero (la "B" può essere maiuscola o minuscola).
1665675319869.png


1665675362493.png


1665675379526.png


CODICE:

C:
int decimale = 123;
int ottale = 0173;
int esadecimale = 0x7b; //oppure 0X7B o anche 0X7b ecc...
int binario = 0b1111011 //oppure 0B1111011


3.2.1 - Literal interi espliciti


Possiamo aggiungere ai literal anche dei caratteri che specificano il tipo di valore che essi rappresentano (unsigned,long,long long ecc...) essi prendono il nome di "literal interi espliciti":

1665675465410.png


C:
unsigned int variabile = 150;
unsigned int variabile = 150u;

//sono la stessa cosa.


4 - Float

I data-type floating point (virgola mobile) usano la parola chiave float, i numeri con la virgola vengono rappresentati dal calcolatore con una | tecnica che si chiama "floating point (virgola mobile)" secondo lo standard IEE754, per dichiarare una variabile di tipo float si fa così:

C:
float variabile;

1665675617985.png




4.1 - Modificatori di float:


In questo caso i tipi alternativi al float non servono a contenere valori più grandi (sebbene occupino comunque più memoria del classico float) ma servono per contenere numeri con la virgola più precisi, cioè con più cifre dopo la virgola, quindi meno approssimati.



4.1.1 Double


Memoria usata: 8 byte

Il tipo double come si può intuire dal nome per rappresentare i numeri con la virgola , fornisce il doppio delle cifre dopo la virgola di un normale float, in questo modo il numero sarà il doppio più preciso:

1665675796834.png



4.1.2 Long double


Memoria usata: variabile (di solito è 12 byte ma può anche essere 10 o 16) nel mio caso è 16 byte.
Il tipo long double per rappresentare i numeri con la virgola fornisce molte più cifre (anche del double) dopo la virgola di un normale float, in questo modo il numero sarà il ancora più preciso:

1665675917877.png


CODICE:
C:
float int variabile;
double varibile;
long double variabile;


4.2 - Floating-point literal


Per "floating-point literal" ci riferiamo ai valori letterali che possiamo utilizzare per rappresentare i nostri dati di tipo floating-point.
Quando vogliamo indicare un numero usando i floating-point literal dobbiamo scrivere il numero nella seguente forma :

1665676021891.png


possiamo anche usare una forma alternativa chiamata "e-notation", essa consiste nello scrivere i numeri nella seguente forma:

1665676050407.png


4.3 - Floating-point literal espliciti


Possiamo aggiungere ai floating-point literal anche dei caratteri che specificano il tipo di valore che essi rappresentano (float,double,long double) essi prendono il nome di floating-point literal espliciti.

1665676150121.png


C:
float variabile;
variabile = 15.10f //la f finale può essere maiuscola o minuscola

Si può fare una cosa simile anche per i long double:

C:
long double variabile;
variabile = 15.10l //la l finale può essere maiuscola o minuscola.

1665676200280.png


5 - Char


Il tipo char è molto particolare, infatti questo data type è usato per i caratteri, tuttavia una variabile di tipo char è grande 1 solo bit e contiene valori di tipo numerico intero con segno, questo perché i valori che saranno contenuti in una variabile char sono codificati usando lo standard ASCII che permette di codificare dei caratteri in valori numerici.
Tramite l'uso dello standard ASCII è possibile anche memorizzare "caratteri non stampabili" come ad esempio la tabulazione o lo spazio.

1665676252579.png

1665676273315.png



5.1 - Char type literal


Per "char type literal" ci riferiamo ai valori letterali che possiamo utilizzare per rappresentare i nostri dati di tipo char, per rappresentare un dato di tipo char si usa la seguente notazione:

1665676329186.png


come possiamo vedere basta usare i singoli apici e inserire tra di essi il carattere.


C:
char variabile = 'a';

//oppure

char variabile = '1';
//(inteso come carattere stampabile e non come valore numerico)

//oppure

char variabile = '/n';

//si può anche assegnare un numero (ti ricordo che il char è praticamente un int con meno memoria)
char variabile = 120;

1665676407992.png



5.2 - Inizializzazione di una variabile char


Una variabile di tipo char può essere inizializzata nei seguenti modi:
C:
//Metodo classico
char variabile = 'X';

//Assegnazione di intero
char variabile = 15;

Il compilatore in questo caso non dovrebbe dare problemi, infatti possiamo usare la variabile char come un una variabile per interi (int) che però può contenere valori molto piccoli (infatti ha solo 1 byte di memoria).


5.3 - Modificatori di char


5.3.1 - Unsigned char


Come abbiamo detto il tipo char può accettare valori sia positivi che negativi, tuttavia ciò limita il numero di valori rappresentabili (ne abbiamo parlato anche per gli unsigned int).
In questi casi ci viene in aiuto il tipo unsigned char che altro non è che un char che però accetta solo valori numerici positivi (unsigned int più piccolo) e caratteri (che alla fine sono comunque numeri).
Non utilizzando valori negativi abbiamo il massimo dello spazio utilizzabile.

6 - tipo Boolean


Il tipo boolean si usa tutte quelle volte in cui dobbiamo rappresentare delle condizioni che hanno solo due stati.

1665676546605.png


Infatti il tipo boolean può assumere solo due valori:
  • 1 (true -> Vero)

  • 0 (false -> Falso).
Per dichiarare una variabile di tipo boolean si usa la seguente sintassi:

C:
_Bool variabile;

HO RAGGIUNTO IL LIMITE MASSIMO DI FILE CHE POSSO ALLEGARE :asd:
FARÒ UN ALTRO POST CON IL CONTINUO
Messaggio unito automaticamente:

Ho un pò esagerato :asd: , comunque ho pubblicato il continuo.