Перейти к содержимому
Topos Uranos

Символы, логические значения, преобразования и константы

Краткое содержание

Тип задаёт не только то, сколько байтов занимает значение, но и то, как читаются его биты: один и тот же байт есть буква «A» для char и число 65 для int. Этот урок дополняет основные типы символами и логическими значениями и изучает переход от одного типа к другому: неявные преобразования, которые компилятор выполняет, не дожидаясь просьбы, и которые могут терять информацию; явное преобразование с помощью static_cast; инициализацию фигурными скобками, которая отвергает потери. Завершают урок константы, const и constexpr, превращающие намерение («это значение не меняется») в гарантию, которую обеспечивает компилятор, а также литералы и auto, определяющие тип значения, записанного в исходном коде.

Цели обучения

  1. Использовать числовой код символа для вычислений, например чтобы получить значение цифры, прочитанной как символ.
  2. Предсказывать результат неявного преобразования между целыми, вещественными и логическими значениями и записывать явное преобразование с помощью static_cast.
  3. Объяснять, почему инициализация фигурными скобками отвергает преобразования, теряющие информацию, и что делает GCC в каждом случае.
  4. Объявлять с const или constexpr каждое значение, которое не должно меняться, и отличать одно слово от другого.
  5. Выводить тип литерала (5, 5u, 5.0, 5.0f, '5', "5") и тот тип, который ему назначает auto.

Тип как способ прочтения

Урок Переменные и память представил переменную как ячейку памяти с именем, типом и значением, а уроки Целые числа и их представление и Числа с плавающей точкой показали, что в ячейке лежат не числа, а биты, и что тип говорит, как их читать. Этот урок доводит эту мысль до её следствия: если тип есть правило чтения, то одни и те же биты означают разное в зависимости от типа, с которым их читают, а перевод значения из одного типа в другой, который в C++ называется преобразованием, означает смену правила. Одни преобразования сохраняют значение (целое 7 превращается в вещественное 7.0 без всяких потерь); другие его искажают (вещественное 2.7 превращается в целое 2). Отсюда вопрос, проходящий через весь урок: сохраняется ли значение при каждом преобразовании, и кто за этим следит?