¿Qué significa esta declaración – while (~ scanf (‘% d% d% d’, & a, & b, & n))?

Si revisa la página del man para scanf() , verá,

Estas funciones devuelven el número de elementos de entrada que coinciden y asignan con éxito, que pueden ser menos de lo previsto o incluso cero en caso de una falla de coincidencia temprana.

El valor EOF se devuelve si se alcanza el final de la entrada antes de que ocurra la primera conversión exitosa o se produzca una falla coincidente. EOF también se devuelve si se produce un error de lectura, en cuyo caso se establece el indicador de error para la secuencia (ver ferror (3)) y se establece errno para indicar el error.

Entonces, en su caso, scanf () puede devolver 0, 1, 2, 3 o EOF.

Complementar 0, 1, 2 o 3 da como resultado un valor distinto de cero y el ciclo while continuará.

Para la mayoría de las implementaciones, EOF es -1 y ~ -1 = 0. Entonces, lo que intenta el código anterior es continuar solicitando entradas hasta que se proporcione el carácter EOF.

Pero tengo que decir que está mal y depende completamente de que EOF sea igual a -1. Además, el código tampoco es legible.

En sistemas Linux y OS X, puede pasar EOF por Ctrl + D. Para Windows, es Ctrl + Z.

Esta es una forma de verificar si scanf () ha llegado al final del archivo o no. Este código se ejecutará hasta que encuentre el EOF.

Cuando scanf () encuentre EOF con valor -1, entonces la declaración será así:

while (~( -1)) que se convierte en while (0) y el bucle se romperá.

Si lo prueba en un código simple para probar, como el que se muestra a continuación, dará como resultado un bucle infinito hasta que proporcione el carácter EOF usando el teclado.

#include

int main (nulo) {
int a = 11;

while (~ scanf (“% d”, & a)); // suministra el caracter EOF usando el teclado
printf (“% d”, a);
devuelve 0;
}

Discusión sobre stackoverflow:

~ es el operador NO bit a bit. Por lo tanto, esta es una forma de bucle ligeramente ofuscada hasta que scanf() devuelve algo distinto de -1. En otras palabras,

while (~ scanf (“% d”, & n))

es equivalente a

while (scanf (“% d”, & n)! = -1)

Esta es una forma horrible de verificar si un valor es diferente de -1. ~x devuelve la negación bit a bit de x . Entonces, teniendo en cuenta el código complementario utilizado para los números negativos (en la mayoría de los compiladores, por cierto, este enfoque ni siquiera es muy portátil) -1 está representado por una secuencia de 1-sy, por lo tanto, ~(-1) producirá un cero.

Por favor no use este enfoque. Simplemente escriba scanf("%d", &n) != EOF Manera más fácil de entender.

Enlace a la discusión: Uso del valor de retorno de “scanf ()” para verificar el final del archivo

Muchas gracias a: Narender Raman

Significa que aceptará 3 valores de tipo entero del usuario.% D muestra que las variables son de tipo de datos enteros y x, y, n son el nombre de las variables.

More Interesting

Sea f (x) = (1 + b ^ 2) x ^ 2 + 2bx + 1 y sea m (b) el valor mínimo de f (x). Como b varía, el rango de m (b) es? ¿Alguien me dirá cómo resolver esas preguntas?

¿Por qué no enseñamos matemáticas discretas o álgebra lineal tanto como el cálculo previo? Las rutas alternativas en una educación matemática pueden ser más propicias para las carreras relacionadas con la informática y las estadísticas, entonces, ¿por qué no las ofrecemos tan pronto?

¿Qué tan difícil es la matemática 217 (Álgebra lineal) en la Universidad de Michigan?

Cómo evaluar [matemáticas] \ displaystyle \ int _ {- \ frac {\ pi} {2}} ^ {\ frac {\ pi} {2}} \ dfrac {\ sin ^ {2008} x} {(2007 ^ x +1) (\ sin ^ {2008} x + \ cos ^ {2008} x)} \, dx [/ math]?

¿Qué es [matemática] 2x ^ 2-4x [/ matemática] entre [matemática] 90 [/ matemática] y [matemática] 100 [/ matemática] donde [matemática] x \ in \ Z [/ matemática]?

Cómo hacer que el área que contiene el eje vertical sea más ancha que el área de trazado en Excel 2016

Recientemente, Myntra lanzó una oferta de compra 1 y 1, pero el precio de los artículos se duplicó y la cantidad aumentó de 1 a 2. ¿Es legal?

¿Cómo puede el Pr (X = 10) = Pr (X = 9) si X = cantidad de goles al lanzar una pelota de baloncesto 10 (= n) veces en la vida real?

Cómo saber si una tabla de Cayley define una operación grupal

Si [matemática] x ^ a [/ matemática] es [matemática] x [/ matemática] multiplicada por sí misma [matemática] a [/ matemática] veces, ¿cómo tiene sentido [matemática] x ^ {- 1} [/ matemática] ?