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

6 minutos de lectura

avatar de usuario de bogatyrjov
bogatyrjov

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

por ejemplo, en contar referencia, 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?

Avatar de usuario de Mark Elliot
marca eliot

los L especifica que el número es un long tipo, entonces -1L es un long establecido en uno negativo, y 1L es un long puesto en positivo.

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

Detectar 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
}

  • Bien, lo tengo. Entonces, ¿cómo atrapo la situación en la que ftell devuelve -1L? — if(ftell(fp) == -1L) {} ? o si(ftell(fp) == -1) {} ?

    – bogatyrjov

    6 de noviembre de 2010 a las 23:00


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

    – bogatyrjov

    6 de noviembre de 2010 a las 23:09

  • @Jevgeni, mira esta lista. Sin embargo, no está completo. falta por lo menos L para wchar_t cuerda.

    – Mateo Flaschen

    6 de noviembre de 2010 a las 23:13

  • @Jevgeni, algunos estándar son f por float y ul por unsigned longAquí está un referencia

    – Mark Elliot

    6 de noviembre de 2010 a las 23:13

  • @Mat: También es parcialmente incorrecto, ¿no? En C el tipo de 'c' es intno char.

    – sepp2k

    6 de noviembre de 2010 a las 23:35

Avatar de usuario de Clifford
clifford

ftell() devuelve el tipo largo tiempoel sufijo L aplicado a un literal obliga a su tipo a largo en lugar de simple En t.

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

Para todos los efectos, generalmente puede simplemente considerar el retorno de error como -1, el sufijo L no es crítico para la operación correcta en la mayoría de los casos debido a las reglas de conversión implícitas.

  • +1 por ser la única persona que parece saber la diferencia entre punteros y números enteros.

    – R.. GitHub DEJA DE AYUDAR A ICE

    7 de noviembre de 2010 a las 0:41

  • Convertir un puntero nulo en un número entero no necesariamente rendir 0.

    –Keith Thompson

    21 de julio de 2013 a las 1:07

  • NULL NO representa un puntero, se define como 0, 0L o 0ULL, etc. Es por eso que C++11 introdujo nullptr. Considerar: int foo(const char*); int foo(unsigned long f); ... foo(NULL);. Eso no llamará al que espera si cree que “NULL” es un tipo de puntero.

    – kfson

    21 de julio de 2013 a las 1:08

  • @ksone: en C (como se etiqueta la pregunta) NULL se define como (void*)0. De hecho, C ++ lo define como 0. En C ++, se desaconseja el uso de NULL (por Bjarne Stroustrup) a favor del cero literal exactamente porque es una macro y puede redefinirse de manera incompatible. C++ garantiza que un cero entero se convierta en un puntero no válido. Sin embargo, en C o C++, NULL se define con el intención que se utiliza como un valor de puntero no válido en lugar de un número entero.

    – Clifford

    21 de julio de 2013 a las 10:13

  • @KeithThompson: ¿Tú crees? De cualquier manera, lo que sea que emita podría ser una posición válida de ftell(), que es más el punto.

    – Clifford

    21 de julio de 2013 a las 10:18


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

Eso significa -1 como 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 es sencillo? NULL? Porque NULL en esta función es un resultado normal y no puede señalar el error también. Por qué NULL en esta función es un resultado normal? Porque NULL == 0 y ftell devuelve la posición en una secuencia, cuando está al inicio de la función de secuencia devuelve 0 y este es un resultado normal, no un error, entonces si compara esta función con NULL para verificar el error, obtendrá un error cuando esté en la posición de inicio en la transmisión.

  • No, NULL no es un resultado normal para ftell. los ftell función devuelve un longno un puntero.

    –Keith Thompson

    21 de julio de 2013 a las 0:19

La edición de hoy implica que todavía se necesitan más detalles.

Marcos tiene razón. El sufijo “L” es largo. -1L es por lo tanto un -1 largo.

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 costumbre general no me gusta buscar -1 explícito. Si alguna vez aparece un -2 en el futuro, mi código lo hará probable No rompa.

Desde que comencé a usar C, allá por el comienzo de C, noté que la mayoría de las rutinas de la biblioteca regresaban En t los valores devuelven 0 para el éxito y -1 en caso de error. La mayoría.

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 inventó C, y tal vez ni siquiera en los sistemas pequeños de hoy. El K&R C original no garantizaba que NULL fuera 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, lo que hace necesario que las direcciones “no válidas” se muevan a alguna otra ubicación dependiente del sistema operativo. Tal sería realmente aceptado por la CPU, simplemente no generado en el esquema normal de las cosas. Quizás 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 que de otro modo no se usaría.

En ese entonces viste un montón de if ( ptr != NULL ) declaraciones en lugar de if ( ptr ) para personas que se toman en serio la escritura de código portátil.

  • No, NULL no es un resultado normal para ftell. los ftell función devuelve un longno un puntero.

    –Keith Thompson

    21 de julio de 2013 a las 0:19

¿Ha sido útil esta solución?