Вопрос действительно в названии; Я уверен, что есть что-то логичное, но пока я в тупике!
Почему побитовые сдвиги (<< и >>) используются для cout и cin?
Ответ 1
Согласно §8.3.1 Проекта и Эволюции C++:
Идея предоставления оператора вывода вместо именованной функции вывода была предложена Дугом Макилрой по аналогии с операторами перенаправления ввода-вывода в оболочке UNIX (>, >>, | и т.д.)
[...]
Несколько операторов были рассмотрены для операций ввода и вывода: "Оператор присваивания был кандидатом для ввода и вывода, но он связывает неправильный путь. То есть
cout=a=b
будет интерпретироваться какcout=(a=b)
, и казалось, что большинство людей предпочитают, чтобы оператор ввода отличался от оператора вывода. Операторы<
и>
были опробованы, но значения "меньше" и "больше чем" были настолько прочно внедрены в сознание людей, что новые операторы ввода/вывода были для всех практических целей нечитаемыми (похоже, что это не так для << и >>). Кроме того, '<' чуть выше ',' на большинстве клавиатур, и люди писали такие выражения:cout < x , y, z;
Нелегко давать хорошие сообщения об ошибках для этого.
Ответ 2
Может быть, потому, что он похож на операцию добавления Unix, поскольку вы по существу добавляете поток ввода/вывода?
например.
Выход
echo "foo" >> bar
код >
Ввод
sendmail -f [email protected] << myemail.txt
(Пример ввода строки из Zac Howland)
Ответ 3
От "Язык программирования С++". Слова Страуструпа (авторы языка):
Перегрузка оператора
<<
на значение '' put to дает лучшую нотацию и позволяет программисту выводить последовательность объектов в одном выражении.Но почему
<<
? Невозможно придумать новый лексический токен. Оператор присваивания был кандидатом для ввода и вывода, но большинство людей предпочитали использовать разные операторы для ввода и вывода. Кроме того, = связывает неправильный путь; то есть cout = a = b означает cout = (a = b), а не (cout = a) = b. Я попробовал операторы<
и>
, но среднее значение "меньше" и "больше" было настолько прочно имплантировано в сознание людей, что новые операторы ввода-вывода были для всех практических целей нечитаемыми.
Ответ 4
>>
и <<
являются просто операторами, и вы можете реализовать свои собственные >>
и <<
для своих классов.
Я предполагаю, что "кто-то" выбрал их, потому что: а) они похожи на операции с файлами оболочки и б) повторно использовать существующие операторы, потому что нет необходимости создавать новые
Ответ 5
Потому что они имели более или менее разумный приоритет и выглядели хорошо. В C++ вы не можете создавать новые операторы или изменять их приоритеты или правила группировки, вы можете только перегружать существующих и изменять то, что они на самом деле делают.
Выбор <<
и >>
имеет некоторый неприятный побочный эффект, потому что он каким-то образом выдвигает идею о том, что вывод будет выполнен с соблюдением порядка. Хотя это верно для фактического результата благодаря умному трюку с цепочкой, оно ложно для вычислений, и это очень часто удивляет.
Чтобы быть более конкретным письмом
std::cout << foo() << bar() << std::eol;
НЕ подразумевает, что foo
будет вызываться перед bar
.
РЕДАКТИРОВАТЬ
С C++ 17 проблема последовательности была "исправлена". Теперь порядок оценки указан слева направо для операторов <<
и >>
. В C++ все еще есть места, где порядок оценки не определен (или даже отсутствует, что означает, что оценка может чередоваться), но несколько распространенных случаев теперь ведут себя предсказуемым и переносимым способом, чтобы увидеть этот ответ.
Ответ 6
Итак, вы помните, что если вы думаете, что cin
в качестве клавиатуры и cout
в качестве монитора, то, что вы вводите, переходит в переменную
cin>>var;
Или содержимое вашей переменной переходит к экрану
cout<<var;
Ответ 7
Они не являются побитовыми операторами, в этом контексте они называются операторами вставки и извлечения.
http://www.cplusplus.com/doc/tutorial/basic_io/
Они используются только для визуальной интерпретации. Если вы изучаете разработку собственного потока и перегрузки оператора, то вы можете видеть, что вы можете использовать + для ввода и - для вывода:)
Ответ 8
Этот ответ неудовлетворительный, но правильный: они не являются побитовыми операторами.
Значение оператора определяется типом данных, который появляется слева. В случае cin и cout (и других типов потоков) < и → операторы перемещают значения в потоки и из них. В случае, когда левый операнд является целым числом, операция представляет собой поразрядную операцию, которую вы уже знаете из C.
Значение оператора не фиксировано, хотя его приоритет.
Ответ 9
В основном из-за их ассоциативности. Операторы вставки и извлечения связываются слева направо, поэтому
std::cout << "Hello" << ' ' << 4 << 2;
оценивается так, как вы ожидали: сначала с "Hello"
, затем с ' '
и, наконец, с 4
и 2
. Разумеется, оператор сложения operator+
также связывается слева направо. Но этот оператор и другие с левой-правой ассоциативностью уже имеют другое значение.
Ответ 10
Бьярне выбрал их для практического приоритета, ассоциативности и мнемонической ценности.
Приоритет не является совершенным, например. операторы boolean и bit-level являются трудными.
Но это довольно нормально.
Ответ 11
Оператор вставки >>
и <<
используются с входным потоком и выходным потоком соответственно, потому что входной поток
означает поток данных в вашу программу, а выходной поток - поток данных из вашей программы.
Поскольку эти операторы вставки выглядят как Направленный оператор (Отображение направления потока данных),
поэтому для входного потока выбирается >>
и <<
для выходного потока.
Посмотрите на часть кода...
int Num1;
cin >> Num1;
здесь, если вы внимательно наблюдаете >>
показывает поток данных в переменную (объявленную в программе)
это означает поток данных в программу, который является заданием входного потока (здесь cin
).
аналогично идет с cout
,
int Num2 = 5;
cout << Num2;
Здесь <<
, показывающий поток данных из программы (поскольку Num2
является частью программы), который является заданием выходного потока.
Я надеюсь, что все это имеет смысл для вас.
Ответ 12
cout << "Output sentence"; // prints Output sentence on screen
cout << 120; // prints number 120 on screen
cout << x; // prints the content of x on screen
< < оператор вводит данные, которые следуют за ним в поток, предшествующий ему. В приведенных выше примерах он вставлял константу string Output, числовую константу 120 и переменную x в стандартный выходной поток cout.
Стандартным устройством ввода обычно является клавиатура. Обработка стандартного ввода в С++ выполняется путем применения перегруженного оператора извлечения ( → ) в потоке cin. За оператором должна следовать переменная, которая будет хранить данные, которые будут извлечены из потока. Например:
int age;
cin >> age;
Ответ 13
Я предполагаю, что вы знаете, что С++ допускает перегрузку оператора. В общем случае вы перегружаете операторы только в том случае, если семантика полностью переносима (например, перегрузка добавления для векторного класса для добавления двух векторов вместе). Я думаю, что ваш вопрос относится к тому, почему можно использовать операторы с битрейтом, перегрузить их для iostream и дать им совершенно иное значение, чем их первоначальная цель. Причина, по которой это может быть сделано, состоит в том, что операции бит-сдвига настолько удалены от того, что делают iostreams, и никто не может быть смущен, чтобы думать, что < или → делает битрейт на iostream. И причина, по которой они удобны в использовании, также заключается в том, что их порядок состоит в том, чтобы сначала оценить операнд слева, затем тот, который находится справа, и выполнить операцию. Это соответствует тому, что вы хотели бы сделать, когда вы используете операторы для добавления или извлечения материала из iostream.
Но, к первоначальному вопросу, почему? Я действительно не знаю, мне просто кажется, что < и → довольно легко понимаются как получение информации от одного объекта и помещение его в другое. Почему причина должна быть более сложной? Понятно использовать их, потому что их смысл очевиден. Что лучше спросить у оператора?