2010-11-06 11 views
18

¿Qué significa "-1L", "1L" etc. en C?¿Qué es "-1L" en C?

Por ejemplo, en ftell referencia, se dice

... Si se produce un error, se devuelve 1L ...

¿Qué significa esto? ¿Cuál es el tipo de "1L"?

¿Por qué no devuelve NULL, si ocurre un error?

Respuesta

39

El L especifica que el número es un tipo long, por lo -1L es un conjunto long a uno negativo, y 1L es un conjunto long a uno positivo.

cuanto a por qué ftell no se limita a volver NULL, es porque NULL se utiliza para los punteros, y aquí se devuelve un long. Tenga en cuenta que 0 no se utiliza porque 0 es un valor válido para ftell para devolver.

captura de esta situación implica la comprobación de un valor no negativo:

long size; 
FILE *pFile; 

... 

size = ftell(pFile); 
if(size > -1L){ 
    // size is a valid value 
}else{ 
    // error occurred 
} 
+0

Ok, lo tengo. Entonces, ¿cómo atrapo la situación donde ftell devuelve -1L? --- if (ftell (fp) == -1L) {}? o si (ftell (fp) == -1) {}? – bogatyrjov

+0

@Jevgeni, editado para darle un ejemplo –

+0

Entonces, si L representa largo, ¿qué caracteres representan otros tipos? ¿Hay alguna referencia relacionada en la red? – bogatyrjov

4

Significa devolver el valor como largo, no como int.

2

Eso significa -1 como una larga (más bien que el tipo predeterminado para los números, que es un entero)

+3

'long' * es * un tipo entero. Creo que quieres decir que el tipo predeterminado para entero * constantes * es 'int' - pero incluso eso es una simplificación excesiva. –

2

-1 formated en long int es un -1L. ¿Por qué no simple NULL? Porque NULL en esta función es un resultado normal y no puede sincronizar el error también. ¿Por qué NULL en esta función es un resultado normal? Como NULL == 0 y ftell devuelven posición en una secuencia, cuando está en el inicio de la función de secuencia devuelve 0 y este es un resultado normal, no hay error, entonces, si compara esta función con NULL para verificar el error, recibirá un error cuando esté en la posición de inicio en la transmisión.

+1

No, 'NULL' no es un resultado normal para' ftell'. La función 'ftell' devuelve un' long', no un puntero. –

6

ftell() Devuelve el tipo largo int, el sufijo L aplicado a un fuerzas literales su tipo a largo en lugar de llanura int.

NULL sería totalmente incorrecto porque es una macro que representa un puntero no un número entero . Su valor, cuando se interpreta y un entero puede representar una posición de archivo válida, mientras que -1 (o cualquier valor negativo) no puede.

Para todos los efectos, por lo general puede simplemente respecto, el retorno de error como -1, el sufijo L no es crítica para el funcionamiento correcto en la mayoría de los casos debido a las reglas implícitas de fundición

+0

+1 por ser la única persona que parece saber la diferencia entre los punteros y los enteros. –

+1

Convertir un puntero nulo en un entero no * necesariamente * cede '0'. –

+0

NULL NO representa un puntero, se define como 0, 0L o 0ULL, etc. Es por eso que C++ 11 introdujo nullptr. Considere: 'int foo (const char *); int foo (unsigned long f); ... foo (NULL); '. Eso no va a llamar al que esperas si crees que "NULO" es un tipo de puntero. – kfsone

1

edición de hoy implica más detalles aún son buscados .

Mark lo tiene todo. El sufijo "L" es largo. -1L es por lo tanto un largo -1.

Mi forma favorita de probar es diferente de Marks y es una cuestión de preferencia, no de bondad.

if (err >= 0L) 
    success 
else 
    error

Por hábito general no me gusta buscar explícito -1. Si aparece un -2 en el futuro mi código será probable no se rompe.

Desde que comencé a usar C, al principio de C, noté que la mayoría de las rutinas de la biblioteca devolviendo int los valores devuelven 0 para el éxito y -1 en caso de error. Más.

NULL normalmente no es devuelto por funciones enteras ya que NULL es un valor de puntero. Además del choque de tipos, una gran razón para no devolver NULL depende de un poco de historia.

Las cosas no estaban limpias cuando se estaba inventando C, y tal vez ni siquiera en sistemas pequeños en la actualidad. El original K & R C no garantizaba que NULL fuera cero, como suele ser el caso en las CPU con memoria virtual. En sistemas pequeños de "memoria real", el cero puede ser una dirección válida, por lo que es necesario que las direcciones "no válidas" se muevan a otra ubicación dependiente del sistema operativo. Tal sería realmente aceptado por la CPU, simplemente no se genera en el esquema normal de las cosas. Tal vez una dirección de memoria muy alta. Incluso puedo ver una matriz oculta llamada extern const long NULL[1]; que permite que NULL se convierta en la dirección de esta matriz que de otra forma no se usaría.

En aquel entonces, usted vio un montón de declaraciones if (ptr != NULL) en lugar de para personas serias sobre la escritura de código portátil.

+0

C * todavía * no garantiza que un puntero nulo tenga la misma representación que cero. Lo que sí garantiza es que una expresión constante entera con el valor cero, o una expresión de este tipo como 'void *', es una constante de puntero nulo. tiempo, dicha constante se convertirá en un puntero nulo, cualquiera que sea la representación que tenga. Lectura recomendada: Sección 5 de las [preguntas frecuentes comp.lang.c] (http://www.c-faq.com/). personalmente, todavía escribo 'if (ptr! = NULL)' ra más que 'if (ptr)' - no por portabilidad, sino por claridad. –

+0

de acuerdo. Yo también lo hago, a menos que, tal vez, esté escribiendo para un entorno POSIX donde no todo el código existente. Entonces seguiré la convención establecida. – Gilbert