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

Мое предпочтительное решение:

function processArray(arr, fn) {
    return arr.reduce(
        (p, v) => p.then((a) => fn(v).then(r => a.concat([r]))),
        Promise.resolve([])
    );
}

Это не принципиально отличается от других, опубликованных здесь, но:

  • Применяет функцию к элементам серии
  • Разрешает массив результатов
  • Не требует async / await (поддержка все еще довольно ограничена, около 2017)
  • Использует функции стрелок;

Пример использования:

const numbers = [0, 4, 20, 100];
const multiplyBy3 = (x) => new Promise(res => res(x * 3));

// Prints [ 0, 12, 60, 300 ]
processArray(numbers, multiplyBy3).then(console.log);

Проверено на разумные текущие версии Chrome (v59) и NodeJS (v8.1.2).

64
задан Yi Jiang 15 March 2011 в 07:16
поделиться

4 ответа

Может быть, потому что это похоже на операцию добавления Unix, поскольку вы по существу добавляете к потоку ввода / вывода?

Например,

Выходные данные

echo "foo" >> bar

Входные данные

sendmail -f test@domain.com << myemail.txt

(Пример ввода данных у Zac Howland)

16
ответ дан Abe Voelker 15 March 2011 в 07:16
поделиться

>> и << являются просто операторами, и вы можете реализовать свои собственные >> и << для своих классов.

Я полагаю, «кто-то» выбрал их, потому что: а) они похожи на операции с файлами оболочки и б) повторно использовать существующие операторы, потому что нет необходимости создавать новые

6
ответ дан Elalfer 15 March 2011 в 07:16
поделиться

Этот ответ неудовлетворительный, но правильный: они не являются побитовыми операторами.

Значение оператора определяется типом данных, который появляется слева. В случае cin и cout (и других типов потоков) < < и >> операторы перемещают значения в и из потоков. В случае, когда левый операнд является целым числом, операция является побитовой операцией, которую вы уже знаете из C.

Значение оператора не является фиксированным, хотя его приоритет есть.

3
ответ дан Kevin A. Naudé 15 March 2011 в 07:16
поделиться

Я предполагаю, что вы знаете, что C ++ допускает перегрузку операторов. В общем случае вы перегружаете операторы, только если семантика полностью переносима (например, перегрузка сложения для векторного класса для сложения двух векторов вместе). Я думаю, что ваш вопрос относится к тому, почему можно использовать операторы bithift, перегружать их для iostream и придавать им совершенно иной смысл, чем их первоначальное назначение. Причина, по которой это может быть сделано, заключается в том, что операции сдвига битов настолько далеки от того, что делают iostreams, и никто не может быть сбит с толку, думая, что < < или >> выполняет сдвиг на Iostream. И причина, по которой их удобно использовать, заключается также в том, что их порядок состоит в том, чтобы сначала оценить операнд слева, а затем справа и выполнить операцию. Это соответствует тому, что вы хотели бы, когда вы используете операторы для добавления или извлечения чего-либо из iostream.

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

0
ответ дан Mikael Persson 15 March 2011 в 07:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: