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?
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 NULL
eso 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
parawchar_t
cuerda.– Mateo Flaschen
6 de noviembre de 2010 a las 23:13
-
@Jevgeni, algunos estándar son
f
porfloat
yul
porunsigned long
Aquí 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'
esint
nochar
.– sepp2k
6 de noviembre de 2010 a las 23:35
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 paraftell
. losftell
función devuelve unlong
no 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 paraftell
. losftell
función devuelve unlong
no un puntero.–Keith Thompson
21 de julio de 2013 a las 0:19