8.2.3 Некоторые Подробности Разработки

Операция вывода используется, чтобы избежать той многоловности, которую дало бы использование функции вывода. Но почему ««?

Возможности изобрести новый лексический символ нет (#6.2). Операция присваивания была кандидатом одновременно и на ввод, и на вывод, но оказывается, большинство людей препочитают, чтобы операция ввода отличалась от операции вывода. Кроме того, = не в ту сторону связывается (ассоциируется), то есть cout=a=b означает cout=(a=b).

Делались попытки использовать операции « и », но значния «меньше» и «больше» настолько прочно вросли в сознание людей, что новые операции ввода/вывода во всех реальных слчаях оказались нечитаемыми. Помимо этого, "«" находится на большинстве клавиатур как раз на ",", и у людей получаются операторы вроде такого:

cout « x , y , z;


Для таких операторов непросто выдавать хорошие сообщения об ошибках.

Операции «„ и “» к такого рода проблемам не приводят, они асимметричны в том смысле, что их можно проассоциировать с "в" и «из», а приоритет «« достаточно низок, чтобы можно было не использовать скобки для арифметических выражений в роли операндов. Например:

cout «„ „a*b+c=“ «« a*b+c «« «\n“;

Естественно, при написании выражений, которые содержат операции с более низкими приоритетами, скобки использовать надо. Например:

cout «„ „a^b!c=“ «« (a^b!c) «« «\n“;

Операцию левого сдвига тоже можно применять в операторе вывода:

cout «„ „a««b=“ «« (a««b) «« «\n“;

В С++ нет выражений с символьными значениями, в частноти, '\n' является целым (со значением 10, если используется набор символов ASCII), поэтому

cout «« "x = " «« x «« '\n';

напечатает число 10, а не ожидаемый символ новой строки. Эту и аналогичные проблемы можно сгладить, определив несколко макросов (в которых используются стандартные имена симвлов ASСII):

#define sp «„ " " #define ht „« «\t“ #define nl «« «\n“

Теперь предыдущий пример запишется в виде:

cout «« "x = " «« x nl;

Для печати символов предоставляются функции ostream::put (char) и chr(int) (см. #8.2.4). Хотя в некоторых кругах нсинтаксические макросы считаются худшим видом макросов, мне они нравятся.

Рассмотрим примеры:

cout «„ x „« " " «« y «« " " «« z «« «\n“; cout «« "x = " «« x «« ", y = " «« y «« «\n“;

Люди находят их трудно читаемыми из-за большого числа кавычек и того, что операция вывода внешне выглядит слишком непривычно. Здесь могут помочь приведенные выше макросы и несколько отступов:

cout «« x sp «« y sp «« z nl; cout «« "x = " «« x «« ", y = " «« y nl;