Подтвердить что ты не робот

Почему побитовые сдвиги (<< и >>) используются для cout и cin?

Вопрос действительно в названии; Я уверен, что есть что-то логичное, но пока я в тупике!

4b9b3361

Ответ 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.

Но, к первоначальному вопросу, почему? Я действительно не знаю, мне просто кажется, что < и → довольно легко понимаются как получение информации от одного объекта и помещение его в другое. Почему причина должна быть более сложной? Понятно использовать их, потому что их смысл очевиден. Что лучше спросить у оператора?