utiliza - que significa endl en c++
¿Por qué los cambios a nivel de bit(<< y>>) se usan para cout y cin? (13)
¿Tal vez porque se parece a la operación de anexión de Unix, ya que esencialmente se agrega a una secuencia de entrada / salida?
P.ej
Salida
echo "foo" >> bar
Entrada
sendmail -f [email protected] << myemail.txt
(Ejemplo de entrada de robo de Zac Howland)
La pregunta está en el título realmente; Estoy seguro de que hay algo lógico, pero por ahora estoy perplejo.
Así que recuerdas que si piensas en cin
como un teclado y en un monitor, lo que escribes va a la variable
cin>>var;
O el contenido de tu variable va hacia la pantalla
cout<<var;
Bjarne los eligió por prioridad práctica, asociatividad y valor mnemotécnico.
La precedencia no es perfecta, por ejemplo, los operadores booleanos y de nivel de bit son problemáticos.
Pero está bastante bien.
De "El lenguaje de programación C ++". Palabras de Stroustrup (autores del lenguaje):
Sobrecargar el operador
<<
para significar '''' poner a '''' da una mejor notación y permite al programador generar una secuencia de objetos en una sola declaración.Pero, ¿por qué
<<
? No es posible inventar un nuevo token léxico. El operador de asignación era un candidato tanto para entrada como para salida, pero la mayoría de la gente parecía preferir usar diferentes operadores para entrada y salida. Además, = se une al camino equivocado; es decir, cout = a = b significa cout = (a = b) en lugar de (cout = a) = b. Probé con los operadores<
y>
, pero la media '''' menor que '''' y '''' mayor que '''' fueron tan firmemente implantados en las mentes de las personas que las nuevas declaraciones de E / S eran ilegibles para todos los propósitos prácticos.
De acuerdo con §8.3.1 de El diseño y la evolución de C ++ :
La idea de proporcionar un operador de salida en lugar de una función de salida nombrada fue sugerida por Doug McIlroy por analogía con los operadores de redirección de E / S en el shell de UNIX (>, >>, |, etc.)
[...]
Se consideraron varios operadores para operaciones de entrada y salida: "El operador de asignación era un candidato tanto para la entrada como para la salida, pero se une de la manera incorrecta. Esto es
cout=a=b
se interpretaría comocout=(a=b)
, y la mayoría de la gente parecía preferir que el operador de entrada fuera diferente del operador de salida. Los operadores<
y>
fueron probados, pero los significados "menor que" y "mayor que" fueron tan firmemente implantados en las mentes que las nuevas declaraciones de E / S eran para todos los propósitos prácticos ilegibles (este no parece ser el caso para << y >>). Aparte de eso, ''<'' está justo arriba '','' en la mayoría de los teclados, y la gente estaba escribiendo expresiones como esta:
cout < x , y, z;
No es fácil dar buenos mensajes de error para esto ".
El operador de inserción >>
y <<
se utilizan con Flujo de entrada y Flujo de salida respectivamente porque el Flujo de entrada significa el flujo de datos en su programa y el Flujo de salida significa el flujo de datos fuera de su programa. Como estos operadores de inserción se ven como el operador direccional (que muestra la dirección del flujo de datos), se elige >>
para el flujo de entrada y <<
para el flujo de salida.
Eche un vistazo a la parte del código ...
int Num1;
cin >> Num1;
aquí si observa cuidadosamente >>
está mostrando flujo de datos a variable (declarado en el programa) que significa el flujo de datos al programa, que es un trabajo de flujo de entrada (aquí cin
).
del mismo modo va con cout
,
int Num2 = 5;
cout << Num2;
Aquí <<
muestra el flujo de datos fuera del programa (ya que Num2
es parte del programa), que es el trabajo de la secuencia de salida.
Espero que todo esto tenga sentido para ti.
Esta respuesta es insatisfactoria pero correcta: no son operadores bit a bit.
El significado del operador está determinado por el tipo de datos que aparece a la izquierda. En el caso de cin y cout (y otros tipos de flujo) << y >> los operadores mueven valores hacia y desde las secuencias. En el caso de que el operando de la izquierda sea un entero, la operación es la operación de bit que usted ya conoce de C.
El significado del operador no es fijo, aunque su precedencia es.
No son operadores bit a bit. Se llaman operadores de inserción y extracción en este contexto.
http://www.cplusplus.com/doc/tutorial/basic_io/
Estos se usan solo para interpretación visual. Si estudias el desarrollo de la transmisión propia y la sobrecarga del operador, entonces puedes ver que incluso puedes usar + para ingresar y - para la salida :)
Porque tenían más o menos una precedencia razonable y se veían bien. En C ++ no puede crear nuevos operadores o cambiar sus reglas de precedencia o agrupamiento, solo puede sobrecargar los existentes y cambiar lo que realmente hace.
La elección de <<
y >>
tiene un desafortunado efecto secundario porque de alguna manera está impulsando la idea de que la salida se hará respetando el orden. Si bien esto es cierto para la salida real gracias a un ingenioso truco de encadenamiento, sin embargo es falso para los cálculos involucrados y esto a menudo es sorprendente.
Para ser más específico escribiendo
std::cout << foo() << bar() << std::eol;
NO implica que foo
sea llamado antes de la bar
.
Principalmente por su asociatividad. Los operadores de inserción y extracción se asocian de izquierda a derecha, por lo que
std::cout << "Hello" << '' '' << 4 << 2;
evalúa como era de esperar: primero con "Hello"
, luego con '' ''
y finalmente con 4
y 2
. De acuerdo, el operador adicional, operator+
también se asocia de izquierda a derecha. Pero ese operador y otros con asociatividad de izquierda a derecha ya tienen un significado diferente.
Supongo que eres consciente de que C ++ permite la sobrecarga del operador. En general, usted sobrecarga a los operadores solo si la semántica es completamente transferible (por ejemplo, sobrecargar el agregado de una clase vectorial para agregar dos vectores). Creo que su pregunta se refiere a por qué uno usaría operadores bitshift, los sobrecargaría para el iostream, y les daría un significado completamente diferente a su propósito original. La razón por la que se puede hacer es porque las operaciones de desplazamiento de bits están tan alejadas de lo que hacen los iostremas que nadie podría confundirse al pensar que << o >> está haciendo un desplazamiento de bits en un iostream. Y la razón por la que son cómodos de usar también es que su orden es evaluar primero el operando de la izquierda, luego el de la derecha y realizar la operación. Esto se ajusta a lo que le gustaría que ocurriera cuando usa los operadores para agregar o extraer cosas de un iostream.
Pero, a la pregunta original, ¿por qué? Realmente no lo sé, me parece que los << y >> se entienden fácilmente como tomar información de una entidad y ponerla en la otra. ¿Por qué la razón necesita ser más complicada que eso? Parece sensato usarlos porque su significado es obvio ... ¿qué mejor podría pedirle a un operador?
>>
y <<
son solo operadores y puede implementar su propio >>
y <<
para sus clases.
Supongo que "alguien" los seleccionó porque: a) son similares a las operaciones de archivos de shell yb) para reutilizar operadores existentes porque no hay necesidad de crear otros nuevos.
cout << "Output sentence"; // prints Output sentence on screen
cout << 120; // prints number 120 on screen
cout << x; // prints the content of x on screen
El operador << inserta los datos que lo siguen en la secuencia que lo precede. En los ejemplos anteriores, insertó la cadena de salida de la frase constante, la constante numérica 120 y la variable x en la secuencia de salida estándar cout.
El dispositivo de entrada estándar suele ser el teclado. El manejo de la entrada estándar en C ++ se realiza aplicando el operador de extracción sobrecargado (>>) en la secuencia cin. El operador debe ir seguido de la variable que almacenará los datos que se extraerán de la transmisión. Por ejemplo:
int age;
cin >> age;