2012-02-16 11 views
6

¿Por qué las funciones de caracteres aceptan el argumento int en lugar del argumento char?ANSI C: ¿Por qué las funciones de caracteres aceptan el argumento int en lugar del argumento 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

Sospecho que la respuesta es similar a la dada [aquí] (http://stackoverflow.com/questions/433895/why-are-c-character-literals-ints-instead-of-chars). En C, los literales de caracteres son del tipo 'int'. –

+0

@Cody: las dos decisiones pueden estar relacionadas, ya que el tipo de datos correcto para hacer "cálculos" en caracteres en C es 'int'. Pero los literales que tienen el mismo tipo que los parámetros de estas funciones no son tan simples como parecen. Puede escribir 'isalnum ('a')', pero no está garantizado que pueda escribir 'isalnum (CHAR_MIN)', o cualquier carácter literal que corresponda a 'CHAR_MIN' en su implementación, porque podría ser negativo.Para coincidir adecuadamente con estas funciones, los literales de caracteres realmente necesitarían escribir 'unsigned', pero luego convertirlos a' char' sería potencialmente malo. –

Respuesta

9

Los caracteres y números enteros son más bien estrechamente unidas en C.

Cuando recibe un personaje de un flujo de entrada, debe ser capaz de representar todos los caracteres además el símbolo de fin de archivo.

Eso significa que un tipo char no será lo suficientemente grande para que utilicen un tipo más ancho.

Los C99, señala el documento justificación:

Dado que estas funciones se utilizan a menudo principalmente como macros, su dominio se limita a los pequeños números enteros positivos representables en un unsigned char, más el valor de EOF. EOF es tradicionalmente -1, pero puede ser cualquier número entero negativo y, por lo tanto, se puede distinguir de cualquier código de carácter válido. Por lo tanto, estas macros se pueden implementar de manera eficiente utilizando el argumento como un índice en una pequeña matriz de atributos.

La norma en sí tiene esto que decir:

La cabecera <ctype.h> declara varias funciones útiles para la clasificación y mapeo caracteres. En todos los casos, el argumento es un int, cuyo valor debe ser representable como un carácter sin signo o debe ser igual al valor del macro EOF. Si el argumento tiene algún otro valor, el comportamiento no está definido.

+1

"El siguiente tipo más grande" sería en realidad "corto". Pero, cuando estos fueron inventados, un 'short' sería promovido a' int' al igual que un 'char'. –

+0

¿Un programador idiota pasa EOF a 'tolower'? –

+0

@JerryCoffin ¿Qué quieres decir? Todos los cortos se siguen promocionando a Ints, siempre que se utilicen en una expresión. – Lundin

3

Deben aceptar EOF además de los valores de caracteres normales. También son anteriores a la invención de prototipos de función. En ese momento, no había forma de pasar un char a una función; siempre se promocionó a int primero.

3

Cuando se inventó C por primera vez, no hubo verificación de argumentos de función en tiempo de compilación. Si uno llamado foo(bar,boz) y bar y boz eran de tipo int, el compilador podría empujar dos int valores en la pila, llame foo, y espero que se espera obtener dos valores int. Dado que los tipos enteros menores que int se promueven a int al evaluar expresiones, las funciones C que se escribieron antes de la invención de prototipos no pudieron pasar ningún tipo entero más pequeño.

0

Sí, podría ser para acomodar EOF, que siempre es un valor sin char, aunque el valor exacto de EOF podría variar con diferentes sistemas, pero nunca será igual que cualquier código de carácter.

Cuestiones relacionadas