2012-02-16 10 views
6

Perché le funzioni dei caratteri accettano l'argomento int invece dell'argomento char?ANSI C: Perché le funzioni dei caratteri accettano l'argomento int invece dell'argomento char?

<ctype.h> 

int isalnum(int c); 
int isalpha(int c); 
int iscntrl(int c); 
int isdigit(int c); 
int isgraph(int c); 
int islower(int c); 
int isprint(int c); 
int ispunct(int c); 
int isspace(int c); 
int isupper(int c); 
int isxdigit(int c); 
int tolower(int c); 
int toupper(int c); 
+0

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'. –

+0

@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. –

risposta

9

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.

+1

"Il prossimo tipo più grande" sarebbe in realtà "corto". Ma, quando questi sono stati inventati, un 'short' sarebbe promosso a' int' proprio come farebbe un 'char'. –

+0

Un programmatore idiota passa EOF a 'tolower'? –

+0

@JerryCoffin Cosa intendi? Tutti i cortometraggi sono ancora promossi a ints, ogni volta che vengono utilizzati in un'espressione. – Lundin

3

Devono accettare EOF in aggiunta ai valori dei caratteri normali. Sono anche antecedenti all'invenzione di prototipi di funzioni. A quel tempo, non c'era modo di passare un char a una funzione - è stato sempre promosso a int prima.

3

Quando C è stato inventato per la prima volta, non è stato eseguito il controllo in fase di compilazione degli argomenti della funzione. Se uno chiamato foo(bar,boz) e bar e boz erano di tipo int, il compilatore avrebbe spinto due int valori sullo stack, chiamare foo, e spero che si aspettava di ottenere due int valori. Poiché i tipi interi più piccoli di int vengono promossi a int durante la valutazione delle espressioni, le funzioni C che sono state scritte prima dell'invenzione dei prototipi non potevano passare alcun tipo di intero più piccolo.

0

Sì, potrebbe essere per ospitare EOF che è sempre un valore non char, anche se il valore esatto di EOF potrebbe variare con sistemi diversi ma non sarà mai uguale a qualsiasi codice di carattere.

Problemi correlati