Ctype.h: differenze tra le versioni
Contenuto cancellato Contenuto aggiunto
m Annullata la modifica di 87.15.159.60 (discussione), riportata alla versione precedente di 188.209.90.146 Etichette: Rollback SWViewer [1.4] |
Nessun oggetto della modifica |
||
(Una versione intermedia di un altro utente non mostrate) | |||
Riga 5:
== Storia ==
I primi programmatori in [[C (linguaggio)|linguaggio C]] su [[Unix]] cominciarono rapidamente a sviluppare dei controlli per classificare i caratteri tra diversi tipi: ''numero'', ''lettera'',''carattere di controllo'', oppure sottoinsiemi quali ''lettera
if ('A' <= c && c <= 'Z' || 'a' <= c && c <= 'z')
Riga 15:
A differenza di quanto riportato sopra, le funzioni di classificazione di caratteri non sono scritte in forma di test comparativi. Nella maggior parte delle librerie C, infatti, esse sono implementate con delle ricerche in tabelle [[allocazione statica della memoria|allocate staticamente]].
Ad esempio, la tabella può essere implementata con un [[array]] di 256 [[Numero intero (informatica)|interi]] da 8 [[bit]] ciascuno, organizzati come [[bitfield]], dove a ciascun bit corrisponde una particolare proprietà del carattere: ''numero'', ''lettera'' e così via. Se il [[bit meno significativo]] del numero intero corrispondesse alla proprietà ''numero'', il codice per la funzione (o, meglio, la macro) <code>isdigit()</code> potrebbe essere scritto semplicemente come:
#define isdigit(x) (TABLE[x] & 1)
Riga 23:
#define isdigit(x) ((x) >= '0' && (x) <= '9')
Questa definizione potrebbe causare problemi se la determinazione del valore di <code>x</code> avesse degli effetti collaterali, come in <code>isdigit(x++)</code> oppure <code>isdigit(esegui_qualcosa())</code>. In questo caso l'espressione sarebbe valutata due volte, cosa non immediatamente evidente al programmatore distratto. Per questo, il metodo della tabella è utilizzato più diffusamente (vedere anche il messaggio di [[Linus Torvalds]] nella [[mailing list]] del kernel Linux, in basso alla pagina).
== Funzioni ==
|