C++: Тип сhar
В этом уроке мы рассмотрим последний целочисленный тип: char
.
сhar
предназначен для хранения символов, таких как буквы и цифры. Но почему же char
это целочисленный тип? Все дело в том, что хранение чисел в памяти компьютера не представляет сложности, тогда как хранение букв связанно с рядом проблем. Поэтому в языках программирования принят простой подход: хранить символы в памяти компьютеров в виде числовых кодов.
Таким образом тип char
является еще одним целочисленным типом.
int main() {
char symbol { 'M' };
int number { symbol };
std::cout << symbol << std::endl; // => M
std::cout << number << std::endl; // => 77
return 0;
}
Интересный момент состоит в том, что на самом деле и в переменной number
и в переменной symbol
хранится значение 77, а когда дело доходит до вывода объект cout
по-разному интерпретирует эти переменные.
char
по умолчанию может быть как беззнаковым так и знаковым типом. Тут все зависит от компилятора. Если для нас крайне важно, что бы тип char
обладал определенным поведением, надо указать это явно:
unsigned char symbol // беззнаковый, диапазон от 0 до 255
signed char symbol // знаковый, диапазон от -128 до 127
Под переменную типа char
выделяется один байт, для работы с символами в кодировке ASCII этого вполне достаточно, но для работы с Unicode нет. Если мы попытаемся определить переменную типа char
, получим ошибку переполнения:
int main() {
char symbol = 'Ф';
return 0;
}
main.cpp:2:21: error: narrowing conversion of '53412' from 'int' to 'char' [-Wnarrowing] 2 | char symbol = 'Ф'; | ^~~
Для работы с символами которые превышают один байт, есть расширенный тип wchar_t
- под котрый выделяется два байта памяти, а начиная со стандарта С++ 11 char16_t
и char32_t
:
int main() {
wchar_t symbol = L'Ф';
char16_t symbol_16 = u'Ю';
char32_t symbol_32 = U'Д';
return 0;
}
Что бы указать принадлежность к тому или иному символьному типу, перед символом ставится префикс. Например, префикс L
обозначает расширенный строковый литерал.
Задание
Определите внутри функции main()
переменную типа char
и сохраните в нее символ U
. Выведите значение переменный в консоль.
Упражнение не проходит проверку — что делать? 😶
Если вы зашли в тупик, то самое время задать вопрос в «Обсуждениях». Как правильно задать вопрос:
- Обязательно приложите вывод тестов, без него практически невозможно понять что не так, даже если вы покажете свой код. Программисты плохо исполняют код в голове, но по полученной ошибке почти всегда понятно, куда смотреть.
В моей среде код работает, а здесь нет 🤨
Тесты устроены таким образом, что они проверяют решение разными способами и на разных данных. Часто решение работает с одними входными данными, но не работает с другими. Чтобы разобраться с этим моментом, изучите вкладку «Тесты» и внимательно посмотрите на вывод ошибок, в котором есть подсказки.
Мой код отличается от решения учителя 🤔
Это нормально 🙆, в программировании одну задачу можно выполнить множеством способов. Если ваш код прошел проверку, то он соответствует условиям задачи.
В редких случаях бывает, что решение подогнано под тесты, но это видно сразу.
Прочитал урок — ничего не понятно 🙄
Создавать обучающие материалы, понятные для всех без исключения, довольно сложно. Мы очень стараемся, но всегда есть что улучшать. Если вы встретили материал, который вам непонятен, опишите проблему в «Обсуждениях». Идеально, если вы сформулируете непонятные моменты в виде вопросов. Обычно нам нужно несколько дней для внесения правок.
Кстати, вы тоже можете участвовать в улучшении курсов: внизу есть ссылка на исходный код уроков, который можно править прямо из браузера.