while una lenguaje funcion fin encontrado dev dentro archivo acción c++ c null eof

c++ - una - while feof



¿Qué es el valor de EOF y ''/ 0'' en C (5)

''/ 0'' es siempre el carácter nulo, o 0. EOF depende del compilador, pero generalmente es -1, y siempre es un valor que un unsigned char no puede contener. No confíe en que el valor de EOF sea nada, ya que PUEDE CAMBIAR. Siempre haga x == EOF no x == -1. El valor de ''/ 0'' es SIEMPRE 0. Puedes contar con eso.

Sé que EOF y ''/0'' son de tipo entero, pero si es así, ¿no deberían tener un valor fijo?

Imprimí ambos y obtuve -1 para EOF y 0 para ''/0'' . ¿Pero son estos valores fijos?

Yo tambien tenia esto

int a=-1; printf("%d",a==EOF); //printed 1

¿El valor para EOF y ''/0'' enteros fijos?


''/ 0'' siempre es 0

EOF es dependiente del compilador

más comúnmente es -1 (en gcc & g ++ es -1).


Sí lo son. ''/0'' tiene el mismo valor de NULL que es 0 (pero significan cosas diferentes), mientras que EOF suele ser -1.

printf("%d",a==EOF); //printed 1

En este caso, usted está preguntando: ¿es un == EOF? si es la impresión 1 (que es verdadera), no es la impresión 0 (que es falsa).


Se garantiza que NULL y ''/0'' se evalúan a 0, por lo que (con las conversiones apropiadas) pueden considerarse idénticos en valor; sin embargo, tenga en cuenta que representan dos cosas muy diferentes: NULL es un puntero nulo (siempre no válido), mientras que ''/0'' es el terminador de cadena. EOF cambio, es una constante entera negativa que indica el final de un flujo; a menudo es -1, pero el estándar no dice nada sobre su valor real.

C & C ++ difieren en el tipo de NULL y ''/0'' :

  • en C ++ ''/0'' es un char , mientras que en C es un int ; esto porque en C todos los caracteres literales son considerados int s.
  • en C ++ NULL es "solo" un 0 integral, mientras que en C se puede definir como un 0 emitido al void * ; esto no puede hacerse en C ++ (y está explícitamente prohibido en una nota) porque, siendo C ++ más estricto en las conversiones de puntero, un void * no es implícitamente convertible a ningún otro tipo de puntero, por lo tanto, si NULL era un void * , sería necesario para convertirlo al tipo de puntero de destino en la asignación:

    int * ptr = (void *) 0; /* valid C, invalid C++ */

Citas estándar relevantes:

C ++ 98/03

NULL

NULL es un tipo entero garantizado para evaluar a 0:

4.10 conversiones de puntero

Una constante de puntero nula es una expresión constante constante (5.19) rvalue de tipo entero que se evalúa a cero. Una constante de puntero nula se puede convertir en un tipo de puntero; el resultado es el valor de puntero nulo de ese tipo y se distingue de cualquier otro valor de puntero a objeto o puntero a tipo de función. Dos valores de puntero nulo del mismo tipo se compararán iguales. La conversión de una constante de puntero nulo a un puntero a un tipo calificado de CV es una conversión única, y no la secuencia de una conversión de puntero seguida de una conversión de calificación (4.4).

18.1 tipos

[...] La macro NULL es una constante de puntero nulo C ++ definida por la implementación en esta norma internacional (4.10). ( Las definiciones posibles incluyen 0 y 0L , pero no (void*)0 ).

''/0''

Debe existir un char de valor 0:

2.2 conjuntos de caracteres

El conjunto de caracteres de ejecución básica y el conjunto de caracteres anchos de ejecución básica contendrán cada uno un carácter nulo (respectivamente, carácter ancho nulo), cuya representación tiene todos los bits cero.

''/0'' es un literal de caracteres:

2.13.2 literales de caracteres

Un literal de carácter es uno o más caracteres encerrados entre comillas simples, como en ''x'' , opcionalmente precedido por la letra L, como en L''x ''. Un literal de carácter que no comienza con L es un literal de carácter ordinario, también conocido como literal de carácter estrecho. Un literal de caracteres ordinarios que contiene un solo c-char tiene tipo char , con valor igual al valor numérico de la codificación del c-char en el conjunto de caracteres de ejecución.

y su valor es 0, ya que la secuencia de escape especifica su valor:

El escape /ooo consiste en la barra invertida seguida de uno, dos o tres dígitos octales que se toman para especificar el valor del carácter deseado.

''/0'' se usa para terminar cadenas literales:

2.13.4 literales de cuerda

Después de cualquier concatenación necesaria, en la fase de traducción 7 (2.1), ''/0'' se agrega a cada cadena literal para que los programas que escanean una cadena puedan encontrar su final.

EOF

La definición de EOF se delega al estándar C89 (como se indica en la sección 27.8.2 "Archivos de la biblioteca C"), donde se define como un entero negativo específico de la implementación.

C99

NULL

Un puntero nulo es un entero 0, opcionalmente convertido a void * ; NULL es un puntero nulo.

6.3.2.3 Punteros

[...] Una expresión de constante entera con el valor 0, o una expresión de este tipo convertida en tipo void * , se denomina constante de puntero nulo. (La macro NULL se define en <stddef.h> (y otros encabezados) como una constante de puntero nulo; consulte 7.17.) Si una constante de puntero nulo se convierte en un tipo de puntero, el puntero resultante, llamado puntero nulo, está garantizado para comparar desigual a un puntero a cualquier objeto o función.

7.17 Definiciones comunes <stddef.h>

[...] Las macros son

NULL

que se expande a una constante de puntero nulo definido por la implementación; [...]

''/0''

''/0'' es un número entero con valor 0, y se usa para terminar cadenas:

5.2.1 juegos de caracteres

[...] Un byte con todos los bits establecidos en 0, llamado el carácter nulo , deberá existir en el conjunto de caracteres de ejecución básico; se utiliza para terminar una cadena de caracteres.

6.4.4.4 Constantes de caracteres

Una constante de caracteres enteros es una secuencia de uno o más caracteres multibyte encerrados entre comillas simples, como en ''x'' . [...]

Los dígitos octales que siguen a la barra diagonal inversa en una secuencia de escape octal se toman como parte de la construcción de un solo carácter para una constante de caracteres enteros o de un solo carácter ancho para una constante de caracteres anchos. El valor numérico del entero octal formado de esta manera especifica el valor del carácter deseado o ancho. [...]

Una constante de carácter entero tiene tipo int .

EOF

EOF es un entero negativo definido por la implementación

7.19 Entrada / salida <stdio.h>

7.19.1 Introducción

EOF

que se expande a una expresión constante de tipo entero, con el tipo int y un valor negativo, que son devueltas por varias funciones para indicar el final del archivo, es decir, no más entradas de un flujo


EOF es una macro que se expande a una expresión constante de tipo entero con el tipo int y un valor negativo dependiente de la implementación, pero es muy comúnmente -1.

''/0'' es un char con valor 0 en C ++ y un int con el valor 0 en C.

El motivo por el cual printf("%d",a==EOF); resultó en 1 porque no asignó el valor EOF a a . En su lugar, verificaste si a era igual a EOF y como eso era cierto ( a == -1 == EOF ) se imprimió 1 .