¿Qué es “-1L” en C?

¿Qué significa “-1L”, “1L”, etc. en C?

Por ejemplo, en referencia de ftell , dice

… Si ocurre un error, se devuelve -1L …

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

¿Por qué no devolver NULL, si se produce un error?

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

En cuanto a por qué ftell no solo devuelve NULL , es porque se usa NULL para los punteros, y aquí se devuelve un long . Tenga en cuenta que 0 no se usa porque 0 es un valor válido para que devuelva ftell .

Capturar esta situación implica verificar un valor no negativo:

 long size; FILE *pFile; ... size = ftell(pFile); if(size > -1L){ // size is a valid value }else{ // error occurred } 

ftell () devuelve el tipo long int , el sufijo L aplicado a un literal hace que su tipo sea long en lugar de llano int .

NULL sería totalmente incorrecto porque es una macro que representa un puntero y no un 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 bashs, generalmente puede considerar el retorno de error como -1, el sufijo L no es crítico para corregir la operación en la mayoría de los casos debido a las reglas de conversión implícitas

Significa devolver el valor como un largo, no un int.

Eso significa -1 como un largo (en lugar del tipo predeterminado para números, que es un número entero)

-1 formado en long int es un -1L . ¿Por qué no simple NULL ? Debido a que NULL en esta función es un resultado normal y no se puede analizar el error también. ¿Por qué NULL en esta función es un resultado normal? Debido a que NULL == 0 y ftell devuelven la posición en una secuencia, cuando está en el inicio de la función de secuencia devuelve 0 y esto es un resultado normal, no error, entonces si compara esta función con NULL para verificar el error, recibirá un error cuando Usted estará en la posición de inicio en la stream.

Edición hoy implica que aún se quieren más detalles.

Mark tiene razón. El sufijo “L” es largo. -1L es así un largo -1.

Mi manera favorita de probar es diferente de las marcas y es una cuestión de preferencia, no de bondad.

  si (err> = 0L)
     éxito
 más
     error 

Por costumbre general no me gusta buscar explícito -1. Si alguna vez aparece un -2 en el futuro, es probable que mi código no se rompa.

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

Normalmente, las funciones de enteros no devuelven NULL, 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 inventaba C, y tal vez ni siquiera en sistemas pequeños en la actualidad. El K&R C original no garantiza que NULL sea cero, como suele ser el caso en las CPU con memoria virtual. En sistemas pequeños de “memoria real”, 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, pero 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]; permitiendo que NULL se convierta en la dirección de esta matriz no utilizada.

En ese entonces viste muchas declaraciones if ( ptr != NULL ) lugar de if ( ptr ) para personas que if ( ptr ) escribir código portable.