
Muhsin Alí
He estado usando “C++ acelerado” para aprender C++ durante el verano, y hay un concepto que parece que no entiendo bien.
Por que es
int x;
if (cin >> x){}
equivalente a
cin >> x;
if (cin){}
Mirando el código, me parece que estamos usando cin como variable. Pero, pensé que era una función. ¿Por qué podemos usar cin de esta manera cuando es x el que tiene el valor que ingresamos en nuestro teclado?
cin
es un objeto de clase istream
que representa el flujo de entrada estándar. corresponde a la cstdio
Arroyo stdin
. El operador >>
la sobrecarga para flujos devuelve una referencia al mismo flujo. La secuencia en sí se puede evaluar en una condición booleana como verdadera o falsa a través de un operador de conversión.
cin
proporciona extracción de secuencia formateada. La operacion
cin >> x;
donde “x” es un int fallará si se ingresa un valor no numérico. Entonces:
if(cin>>x)
regresará false
si ingresa una letra en lugar de un dígito.
este sitio web en consejos y trucos usando E/S de C++ también te ayudará.

david hamen
Nota: Respuesta actualizada cuatro años después del hecho para abordar tanto C++98/03 como C++11 (y posteriores).
std::cin
es una instancia de un std::istream
. Esa clase proporciona dos sobrecargas que pertenecen a esta pregunta.
operator >>
lee datos de la secuencia en la variable de destino si eso es posible. Si el contenido inmediato de la transmisión no se puede traducir al tipo de la variable de destino, la transmisión se marca como no válida y la variable de destino se deja intacta. Independientemente del éxito/fracaso de la operación, el valor devuelto es una referencia a la secuencia.
- Cualquiera
operator void*()
(anterior a C++ 11), que convierte la referencia de flujo en un void*
puntero, o explicit operator bool()
(C++11), que convierte la referencia de flujo en un valor booleano. El resultado de esta conversión es un puntero no nulo (pre-C++11) o true
(C++11) si la secuencia es válida, pero el puntero nulo (anterior a C++11) o false
(C++11) si la transmisión no es válida.
Un if
La declaración necesita un booleano, un entero o un puntero como la cantidad a probar. El resultado de std::cin >> x
es una referencia a un istream
, que no es ninguno de los anteriores. Sin embargo, la clase istream
tiene los operadores de conversión que se pueden utilizar para transformar el istream
referencia a algo usable en un if
declaración. Es el operador de conversión específico de la versión que usa el lenguaje para el if
prueba. Dado que la falla de lectura marca la transmisión como inválida, el if
la prueba fallará si la lectura no funcionó.
La razón de la más enrevesada operator void*
miembro de conversión anterior a C++11 es que no fue hasta C++11 que el ya existente explicit
La palabra clave se amplió para aplicarse tanto a los operadores de conversión como a los constructores. Un no explícito operator bool()
habría presentado demasiadas oportunidades para que los programadores se pegaran un tiro en el pie. Hay problemas con operator void*()
así como. El “modismo bool seguro” habría sido una solución, pero simplemente extendiendo explicit
logró exactamente lo que logra el idioma bool seguro, y sin tener que usar mucha magia SFINAE.
cin
es una variable (global) de tipo istream
no una función.
los istream
la clase anula la >>
operador para realizar la entrada y devolver una referencia al objeto en el que lo llamó (cin
).
cin
es variable en std
espacio de nombres
operator>>
referencia de retorno a cin
por eso puedes escribir: cin >> a >> b
en lugar de cin >> a; cin >> b;
Las respuestas anteriores son informativas. Aquí solo doy un comentario extra.
std::cin
es un objeto de clase istream
y representa el flujo de entrada estándar (es decir, el teclado) que corresponde a stdin
C ª Arroyo.
cin >> x
primero leería un int del flujo de entrada estándar y lo asignaría a x
. Después de eso, devuelva una referencia propia a cin
. Así que el valor de retorno de la llamada a la función cin >> x
es todavía cin
.
Así que desde el punto de si condición, if(cin)
y if(cin >> x)
se parecen entre sí. El estandar Biblioteca OI define una función para la transmisión como esta (depende de la implementación):
explicit operator bool() const; // C++11
o
operator void*() const; //C++98, C++2003
De estas dos declaraciones, sabemos que emitir los tipo de corriente directa o indirectamente (a través de void*
pintar a bool
lo cual es obvio) a bool
escribe.
Dentro de estas dos funciones, dependen de unos principios básicos. vapor io estados (campos de clase) para determinar si devuelve falso o verdadero (por void*
caso, es nullptr
O no).
cin
es una instancia de clase istream
que hereda la casting-to-bool función. ¡Así que funciona!

Érix
porque el resultado de la expresión
cin >> x
evalúa a
cin
después de que se lea la transmisión.

Ryan Le
1) cin
es una instancia de istream
ver http://www.cplusplus.com/reference/iostream/cin/.
2) el >>
operador de istream
devolverá su operando izquierdo, en este caso es cin
ver http://www.cplusplus.com/reference/istream/istream/operator%3E%3E/. Este operador establecerá failbit
encendido si no se extrajeron caracteres de la cin
en caso de que el lector haya terminado EOF
por lo que no habrá más caracteres para leer.
3) A partir del 2) anterior, cuando la condición se evalúa después de la operación de lectura, if (cin >> x)
debe ser como if (cin)
consulte este enlace http://www.cplusplus.com/reference/ios/ios/operator_bool/ verás que, esto if
el bloque devolverá:
-
Un puntero nulo si al menos uno de failbit
o badbit
Está establecido. Algún otro valor de lo contrario (para el estándar C ++ 98).
-
La función devuelve falso si al menos uno de estos indicadores de error está establecido y verdadero en caso contrario. (para el estándar C++11)