В этом уроке мы рассмотрим последний целочисленный тип: 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
. Выведите значение переменный в консоль.
Если вы зашли в тупик, то самое время задать вопрос в «Обсуждениях». Как правильно задать вопрос:
Тесты устроены таким образом, что они проверяют решение разными способами и на разных данных. Часто решение работает с одними входными данными, но не работает с другими. Чтобы разобраться с этим моментом, изучите вкладку «Тесты» и внимательно посмотрите на вывод ошибок, в котором есть подсказки.
Это нормально 🙆, в программировании одну задачу можно выполнить множеством способов. Если ваш код прошел проверку, то он соответствует условиям задачи.
В редких случаях бывает, что решение подогнано под тесты, но это видно сразу.
Создавать обучающие материалы, понятные для всех без исключения, довольно сложно. Мы очень стараемся, но всегда есть что улучшать. Если вы встретили материал, который вам непонятен, опишите проблему в «Обсуждениях». Идеально, если вы сформулируете непонятные моменты в виде вопросов. Обычно нам нужно несколько дней для внесения правок.
Кстати, вы тоже можете участвовать в улучшении курсов: внизу есть ссылка на исходный код уроков, который можно править прямо из браузера.
Ваше упражнение проверяется по этим тестам
1#include "test_helper.h"
2
3TEST_CASE("testing solution") {
4 std::string expected = "U\n";
5 std::string actual = get_output(sizeof(expected));
6
7 CHECK(actual == expected);
8}
9
Решение учителя откроется через: