strtonum parse ejemplo convert c

parse - strtol c ejemplo



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

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 -1 largo.

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

if ( err >= 0L ) success else 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 bibliotecas 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 de otra manera.

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

¿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?


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


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


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

NULL sería totalmente incorrecto porque es una macro que representa un puntero 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 intentos, 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


-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 sincronizar 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 corriente.


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 valor long . Tenga en cuenta que 0 no se usa porque 0 es un valor válido para que devuelva ftell .

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