Floating-Point, Caratteri e Booleani
Oltre ai numeri interi, il C++ dispone di tipi fondamentali per modellare numeri reali, testo e stati logici.
Tipi Floating-Point (Virgola Mobile)
Section titled “Tipi Floating-Point (Virgola Mobile)”I tipi floating-point memorizzano approssimazioni di numeri reali (es. 3.14 o 98.6). Poiché la memoria del computer è finita, è impossibile rappresentare numeri reali con precisione infinita (come il Pi greco). Il C++ offre tre livelli di precisione (basati generalmente sullo standard IEEE 754):
float: singola precisione (tipicamente 4 byte).double: doppia precisione (tipicamente 8 byte). La scelta predefinita e più sicura.long double: precisione estesa.
Letterali e Formattazione
Section titled “Letterali e Formattazione”I letterali con punto decimale sono per default di tipo double. Per forzare un float, aggiungi il suffisso f o F (es. 3.14f). Per usare la notazione scientifica, usa la lettera e (es. 6.022e23 per il numero di Avogadro).
Gli specificatori di formato per printf:
%f➔ Formato decimale classico.%e➔ Formato scientifico.%g➔ Il compilatore sceglie automaticamente la versione più compatta tra%fe%e.
I Caratteri e l’Unicode
Section titled “I Caratteri e l’Unicode”I tipi carattere memorizzano dati testuali. Il C++ moderno dispone di diverse varianti per supportare alfabeti complessi (Unicode):
char: il tipo di default (1 byte). Perfetto per l’inglese e la tabella ASCII standard. Può essere signed o unsigned.char16_techar32_t: caratteri larghi (wide characters) necessari per le codifiche UTF-16 e UTF-32.wchar_t: progettato per contenere il carattere più largo supportato dal locale del sistema operativo.
I letterali carattere (character literals) sono racchiusi tra apici singoli ('a').
Per dichiarare un carattere Unicode specifico, si utilizzano i prefissi:
L'Z'genera unwchar_t.u'\u0041'genera unchar16_t(il codice\uè seguito da 4 cifre esadecimali, in questo caso la ‘A’).U'\U0001F37A'genera unchar32_t(il codice\Uè seguito da 8 cifre, utile ad esempio per le Emoji come il boccale di birra 🍺).
Lo specificatore base per printf è %c, mentre per i wchar_t si usa %lc.
ASCII ed Escape Sequences (Codici di Controllo)
Section titled “ASCII ed Escape Sequences (Codici di Controllo)”Lo standard ASCII (American Standard Code for Information Interchange), risalente agli anni ‘60, assegna i numeri interi da 0 a 127 a caratteri specifici:
- I codici da 32 a 127 sono i caratteri “stampabili” (alfabeto, numeri, punteggiatura).
- I codici da 0 a 31 sono i codici di controllo. Erano usati per comandare dispositivi fisici come stampanti ad aghi o macchine a nastro magnetico (es.
BELLfaceva suonare una campanella hardware).
Alcuni codici di controllo sopravvivono in C++ sotto forma di sequenze di escape, precedute dal backslash \:
\n: Line Feed (Ritorno a capo)\r: Carriage Return (Riporta il cursore all’inizio della riga)\t: Tabulazione (Tab)\0: Carattere Null (0 decimale, usato in C/C++ come terminatore delle stringhe)\a: Alert (il vecchioBELL)
I Booleani e gli Operatori Logici
Section titled “I Booleani e gli Operatori Logici”Il tipo bool può assumere esclusivamente due stati: true (vero) e false (falso).
In C++, i tipi interi e i booleani sono strettamente collegati:
trueviene promosso a1,falsea0.- Regola vitale: qualsiasi numero intero diverso da zero viene convertito tacitamente in
true. Solo0equivale afalse.
Poiché non esiste uno specificatore printf esclusivo per i bool, li si stampa come interi tramite %d.
Operatori Logici
Section titled “Operatori Logici”Gli operatori logici permettono di combinare più espressioni booleane:
!(NOT unario): inverte lo stato (!truediventafalse).&&(AND logico): restituiscetruesolo se entrambi gli operandi sono veri.||(OR logico): restituiscetruese almeno uno degli operandi è vero.
Esercizio Pratico: L’Alfabeto ASCII
Section titled “Esercizio Pratico: L’Alfabeto ASCII”Prova a utilizzare le tue conoscenze dei caratteri e dei cicli per stampare l’alfabeto minuscolo. Ricorda che i caratteri sono in realtà numeri interi sotto il cofano!
Il tipo std::byte e void
Section titled “Il tipo std::byte e void”I programmatori di sistema spesso manipolano la memoria grezza (raw memory). Prima del C++17 si utilizzavano array di unsigned char o char per simulare i byte grezzi. Ora esiste std::byte (in <cstddef>).
A differenza di un char, std::byte non è né un numero né un carattere: non puoi farci addizioni matematiche, puoi unicamente applicarvi operatori logici bit-a-bit. Questo lo rende estremamente sicuro da usare. Il prefisso std:: indica che fa parte del namespace della Libreria Standard.
Il tipo void, infine, rappresenta un set di valori vuoto. Si utilizza principalmente per indicare che una funzione “non restituisce nulla” al chiamante.