Без +
результат будет другим. Следующий фрагмент кода выводит a 97
вместо a a
char ch = 'a';
std::cout << ch << ' ' << +ch << '\n';
Причина в том, что из-за разных перегрузок печатает данные разных типов .
Для std::basic_ostream
перегрузки basic_ostream& operator<<( char value );
нет, и это объясняется в конце страницы
Символьные и символьные строковые аргументы (например, типа char
или const char*
) обрабатываются не членскими перегрузками из operator<<
. Попытка вывести символ с использованием синтаксиса вызова функции-члена (например, std::cout.operator<<('c');
) вызовет одну из перегрузок (2-4) и выведет числовое значение . Попытка вывести символьную строку с использованием синтаксиса вызова функции-члена вызовет перегрузку (7) и вместо этого выведет значение указателя.
Перегрузка , не являющаяся членом , которая будет вызываться при передаче переменной char
, равна
template< class CharT, class Traits> basic_ostream<CharT,Traits>& operator<<(
basic_ostream<CharT,Traits>& os, char ch );
, который печатает символ в кодовой точке ch
Таким образом, если вы передадите char
, signed char
или unsigned char
непосредственно в поток, он выведет символ. Если вы попытаетесь удалить +
в приведенных выше строках, вы увидите, что он печатает некоторые «странные» или невидимые символы, что не соответствует ожиданиям
Если вы хотите вместо этого использовать их числовые значения, вы должны вызвать перегрузку для short
, int
, long
или long long
. Самый простой способ сделать это - повысить с char
до int
с унарным плюсом +
. Это одно из редких полезных приложений унарный оператор плюс . Явное приведение к int
также будет работать
Есть много людей, которые сталкивались с такой проблемой на SO, как