I personaggi e gli interi sono invece fortemente unita in C.
Quando si riceve un personaggio da un flusso di input, deve essere in grado di rappresentare ogni singolo carattere più il simbolo di fine file.
Ciò significa che un tipo char
non sarà abbastanza grande in modo da utilizzare un tipo più ampio.
C99 documento razionale afferma:
Dal momento che queste funzioni sono spesso utilizzati principalmente come le macro, il loro dominio è limitato ai piccoli numeri interi positivi rappresentabili in un unsigned char, più il valore di EOF. EOF è tradizionalmente -1, ma può essere un numero intero negativo e quindi distinguibile da qualsiasi codice di carattere valido. Queste macro possono quindi essere implementate efficientemente usando l'argomento come indice in una piccola serie di attributi.
La norma stessa ha questo da dire:
L'intestazione <ctype.h>
dichiara diverse funzioni utili per la classificazione e mappatura caratteri. In tutti i casi l'argomento è un int, il cui valore deve essere rappresentabile come un carattere senza segno o uguale al valore della macro EOF. Se l'argomento ha un altro valore, il comportamento non è definito.
Sospetto che la risposta sia simile a quella data [qui] (http://stackoverflow.com/questions/433895/why-are-c-character-literals-ints-instead-of-chars). In C, i caratteri letterali sono di tipo 'int'. –
@Cody: le due decisioni possono essere correlate, in quanto il tipo di dati corretto per eseguire "calcoli" sui caratteri in C è 'int'. Ma i letterali che hanno lo stesso tipo dei parametri di queste funzioni non è così semplice come sembra. Puoi scrivere 'isalnum ('a')', ma non sei sicuro di poter scrivere 'isalnum (CHAR_MIN)', o qualunque carattere letterale corrisponde a 'CHAR_MIN' nella tua implementazione, perché potrebbe essere negativo.Per corrispondere correttamente a queste funzioni, i letterali dei caratteri avrebbero davvero bisogno di 'unsigned', ma poi convertirli in' char' sarebbe potenzialmente negativo. –