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 unchar
, mientras que en C es unint
; esto porque en C todos los caracteres literales son consideradosint
s. en C ++
NULL
es "solo" un 0 integral, mientras que en C se puede definir como un 0 emitido alvoid *
; 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, unvoid *
no es implícitamente convertible a ningún otro tipo de puntero, por lo tanto, siNULL
era unvoid *
, 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
y0L
, 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 tipochar
, 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 macroNULL
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
.