Зачем нужны типы?

190
26 апреля 2019, 12:00

Для чего вообще нужны типы в языке? Разве не проще было бы писать везде auto или вообще не указывать ничего перед именем переменной?

Answer 1

Нужна какая-то наглядная аналогия из жизни.

Например:

Есть гвозди и шурупы. Это разные ТИПЫ крепежа.

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

Столяру (транслятору) нужно знать тип крепежа, чтобы правильно применить к этому крепежу операцию (соответственно забить гвоздь молотком или завернуть шуруп отверткой).

Также транслятору нужно знать тип операндов, чтобы правильно вызвать подпрограмму с заказанной операцией.

Нужно также понимать, что при сложении двух переменных типа int транслятор вызывает одну подпрограмму, а при сложении двух переменных типа float транслятор вызывает совсем другую подпрограмму (в терминах столяра берет либо молоток либо отвертку).

UPD1:

Зайдем с другого бока.

Все рассуждения относятся к архитектуре x86.

Пусть транслятору сначала надо сложить сначала два целых (int числа), а потом транслятору надо сложить два числа с плавающей точкой (float числа).

Когда транслятор складывает два целых (int) числа, то он просто вызывает команду add.

Когда транслятор складывает два float числа, то он пересылает оба операнда в сопроцессор с плавающей точкой, потом включает сопроцессор с плавающей точкой, потом дожидается конца операции, потом достает результат из сопроцессора с плавающей точной и помещает этот результат в память.

Из этого примера видно, что, в зависимости от типа операндов, действия транслятора существенно разные. Поэтому транслятору нужно знать не только какая операция ему заказана программистом (в данном примере заказано сделать сложение), но также транслятору нужно знать типы операндов, чтобы правильно выполнить операцию сложения. Ибо, хотя в обоих случаях операция как-бы одна и та же (сложение), но транслятор (и процессор) выполняют ее существенно по-разному для разных типов операндов. Для типа int достаточно одной команды add. А для типа float нужна целая подпрограмма.

Answer 2

Если я правильно понял, вы спрашиваете, почему в С++ не используется динамическая типизация?

На википедии есть список минусов этого подхода.

Вот пара основных:

  1. С ней программы работают медленнее.

    При этом, когда она на самом деле требуется, то ее можно эмулировать поверх статической (всякими std::variant и т.п.), жертвуя скоростью только там, где это необходимо.

  2. Она не позволяет обнаруживать ошибки несоответствия типов во время компиляции, снижая надежность программ.

Answer 3

Тип данных определяет, что именно представляют собой данные. Как с этими данными работать, какие возможные значения эти данные могут иметь, как их храниться в памяти, какие операции с ними можно делать, ...

Ключевое слово auto подразумевает автоматическое определение типа переменной в зависимости от контекста. Т.е. переменная в любом случае определенного типа, просто этот тип определяется компилятором автоматически. Не всегда окружающего контекста может быть достаточно для автоматического определения типа, например, когда переменной при объявлении не присваивается какое-либо значение.

READ ALSO
Тип указателя на член класса

Тип указателя на член класса

Какой тип имеет указатель на член класса? Другими словами, что нужно подставить здесь, чтобы работало? Очевидное int* не работает

177
lower_bound и iterator

lower_bound и iterator

не знаю как заставить это работатьперепробовал уже все варианты (auto, iterator, const_iterator)

157
Поиск библиотеки для распаковки данных

Поиск библиотеки для распаковки данных

Есть задача распаковать данные, запакованные с помощью zlib и это делается всего одной функцией из этой библиотекиНо если у меня из всей библиотеки...

158