Бесплатный курс по C++. Зарегистрируйтесь для отслеживания прогресса →

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. Выведите значение переменный в консоль.

Упражнение не проходит проверку — что делать? 😶

Если вы зашли в тупик, то самое время задать вопрос в «Обсуждениях». Как правильно задать вопрос:

  • Обязательно приложите вывод тестов, без него практически невозможно понять что не так, даже если вы покажете свой код. Программисты плохо исполняют код в голове, но по полученной ошибке почти всегда понятно, куда смотреть.
В моей среде код работает, а здесь нет 🤨

Тесты устроены таким образом, что они проверяют решение разными способами и на разных данных. Часто решение работает с одними входными данными, но не работает с другими. Чтобы разобраться с этим моментом, изучите вкладку «Тесты» и внимательно посмотрите на вывод ошибок, в котором есть подсказки.

Мой код отличается от решения учителя 🤔

Это нормально 🙆, в программировании одну задачу можно выполнить множеством способов. Если ваш код прошел проверку, то он соответствует условиям задачи.

В редких случаях бывает, что решение подогнано под тесты, но это видно сразу.

Прочитал урок — ничего не понятно 🙄

Создавать обучающие материалы, понятные для всех без исключения, довольно сложно. Мы очень стараемся, но всегда есть что улучшать. Если вы встретили материал, который вам непонятен, опишите проблему в «Обсуждениях». Идеально, если вы сформулируете непонятные моменты в виде вопросов. Обычно нам нужно несколько дней для внесения правок.

Кстати, вы тоже можете участвовать в улучшении курсов: внизу есть ссылка на исходный код уроков, который можно править прямо из браузера.

Полезное


Нашли ошибку? Есть что добавить? Пулреквесты приветствуются https://github.com/hexlet-basics
Если вы столкнулись с трудностями и не знаете, что делать, задайте вопрос в нашем большом и дружном сообществе