|
||||
|
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; |
|
||