Comprensione dei tipi di dati, del casting e delle strutture C

6

C è severo riguardo a ciò che tiene in memoria. Non indovina. Devi dirgli esattamente che tipo di dati stai memorizzando. Questa non è solo pedanteria. Influisce sul modo in cui viene eseguito il programma, sulla quantità di memoria utilizzata e se i calcoli risultano corretti o errati.

I tipi di variabili standard

Ci sono tre tipi di variabili standard in C.

Intero: int
Questo è un numero intero di 4 byte. Gestisce numeri interi.

Virgola mobile: float
Questo è un valore in virgola mobile a 4 byte. Gestisce i decimali.

Carattere: char
Questo è un carattere singolo da 1 byte. Pensa “a” o “3”. Una stringa in C è semplicemente un array di questi caratteri.

Poi ci sono i tipi derivati. Li usi quando i tre standard non lo tagliano.

  • double : un valore in virgola mobile di 8 byte. Più precisione.
  • short : un numero intero di 2 byte. Meno memoria, meno portata.
  • unsigned short o unsigned int : gestiscono solo numeri interi positivi. Nessun bit di segno. Se è necessario tenere traccia del conteggio della popolazione o delle dimensioni dei pacchetti, questa è spesso la scelta giusta.

Operatori e precedenza degli operatori

Gli operatori in C sembrano familiari.

  • Aggiunta +
  • Sottrazione -
  • Divisione /
  • * moltiplicazione
  • % mod

Ma attenzione alla divisione. L’operatore “/” esegue la divisione dei numeri interi se entrambi gli operandi sono interi. Altrimenti esegue la divisione in virgola mobile.

Guarda questo codice:

Stampa un valore in virgola mobile perché “a” è dichiarato come tipo “float”. Ma “a” sarà 3.0. Perché? Perché il codice ha eseguito prima la divisione intera. 10 diviso per 3 dà 3. Il risultato è 3. Quindi quel 3 viene convertito in 3.0 quando memorizzato in “a”. La precisione è stata persa prima ancora di toccare la variabile.

La precedenza degli operatori in C segue le regole standard. La divisione e la moltiplicazione avvengono prima dell’addizione e della sottrazione.

Il risultato di “5+34″ è 17. Non 32. L’operatore “ ” ha una precedenza maggiore rispetto a “+”. Puoi sovrascriverlo con le parentesi. “(5+3)*4” è 32. “5+3” viene valutato per primo.

La precedenza diventa confusa più tardi. Una volta che i puntatori entrano nella chat, diventa complicato. Ma per ora, ricorda: moltiplica e dividi prima di aggiungere e sottrarre.

Typecasting

C ti consente di convertire i tipi al volo. Lo fai spesso con i puntatori. Per alcuni tipi avviene anche automaticamente durante l’assegnazione.

Nell’esempio sopra, il risultato intero di “10/3” è stato convertito automaticamente in un numero in virgola mobile. E se volessi il decimale?

Si esegue il typecasting inserendo il nome del tipo tra parentesi prima del valore.

Sostituisci a=10/3; con a=(float)10/3;.

Ora “a” è 3,33333. Il 10 viene convertito in un valore in virgola mobile prima della divisione. La divisione avviene in terre in virgola mobile. Il risultato mantiene le cifre decimali.

Typedef

Puoi dichiarare tipi con nome definiti dall’utente in C con l’istruzione typedef. Questo è comune nel codice C.

Ciò ti consente di dichiarare tipi booleani. C non ha un tipo “bool” nativo negli standard più vecchi, quindi questa è una soluzione alternativa.

Se non ti piace la parola “galleggiante”, puoi dire:

Poi più tardi:

Inserisci le istruzioni typedef ovunque nel programma. Assicurati solo che arrivino prima del loro primo utilizzo.

Strutture

Le strutture in C raggruppano le variabili in un pacchetto.

Ogni volta che vuoi dichiarare strutture di tipo “rec”, devi dire “struct rec”. Questo è facile da dimenticare. Riceverai errori del compilatore se tralasci la struct.

Puoi comprimere il codice:

Qui, la dichiarazione del tipo e la variabile “r” sono dichiarate nella stessa istruzione.

Oppure usa typedef per il nome della struttura. Se odi digitare “struct rec r” ogni volta:

Quindi dichiarare i record dicendo:

Accedere ai campi utilizzando un punto. r.a = 5;.

Array

Dichiari gli array inserendo una dimensione dopo la dichiarazione normale.

Gli array sono blocchi di memoria contigui. L’accesso a un indice al di fuori dei limiti è un comportamento indefinito. Potrebbe bloccarsi. Potrebbe corrompere i dati. Potrebbe sembrare che funzioni finché non è così.

Incremento

C ha scorciatoie per le operazioni comuni.

  • i = i + 1; diventa i++;
  • i = i - 1; diventa i--;
  • i = i + 3; diventa i += 3;
  • i = i * j; diventa i *= j;

Questi non sono solo zucchero sintattico. Spesso compilano in un codice macchina più efficiente. Usali.

Errori C da evitare

L’operatore / con due numeri interi è una trappola. Tronca la parte decimale. Controlla sempre i tuoi tipi prima di dividerli. Se hai bisogno di precisione, esegui prima il cast di un operando su “float” o “double”.

Pensaci ogni volta che lo usi. Altrimenti i tuoi numeri saranno sbagliati. E il debug dei problemi di divisione intera è doloroso.

Prova questo

  • Sperimenta il typecasting. Prova “int”, “char”, “float”. Guarda cosa succede quando li mescoli.
  • Creare una serie di record. Scrivi il codice per ordinare quell’array su un campo intero. Ti insegna i puntatori, il layout della memoria e il flusso di controllo.

I dettagli contano in C. Manca un tipo e l’intero programma si interrompe. Fallo bene e funziona velocemente.