Почему не сделал C, имеют булев тип данных до C99?

Я понимаю, что Вы можете просто #define некоторые целые числа, но почему не сделал C, имеют специализированный булев тип данных перед C99?

Это - такая частотность в программировании и логике, я не понимаю отсутствия явного типа и нотации.

40
задан James McNellis 19 June 2010 в 21:56
поделиться

10 ответов

Если вы проводите немного времени в библиотеке, вам не нужно строить догадки. Вот некоторые утверждения, взятые из Статья Денниса Ричи об эволюции C . Контекст таков, что Деннис строит на языке Кена Томпсона B, который был реализован на очень крошечной PDP-7, машине с адресной словарной адресацией. Из-за растущего интереса группа получила один из самых первых PDP-11. Деннис пишет:

Появление PDP-11 выявило несколько недостатков семантической модели Б. Во-первых, его механизмы обработки символов, унаследованные с небольшими изменениями от BCPL, были неуклюжими: использование библиотечных процедур для распределения упакованных строк по отдельным ячейкам, а затем их переупаковки или для доступа и замены отдельных символов стало неудобным, даже глупым на компьютере. байт-ориентированная машина.

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

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

(Акцент мой.)

Далее в статье описываются попытки Денниса изобрести новую семантику указателей, заставить работать массивы и примириться с этой новомодной идеей struct . Понятия безопасности типов и отличия логических значений от целых чисел не казались важными до гораздо более позднего времени: -)

25
ответ дан 27 November 2019 в 01:26
поделиться

Процессор не имеет «логического типа», они работают только с байтами и кратными им, поэтому логический тип не имел смысла в то время, так как он не давал преимущества (зачем использовать тип, когда вы можете проверить только «is 0» или «is not null»)

10
ответ дан 27 November 2019 в 01:26
поделиться

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

7
ответ дан 27 November 2019 в 01:26
поделиться

Потому что они не вставили его. Извините, если это звучит грубо, но в основном это не было определено как таковое.

Помните, что большинство людей #define ИСТИНА и ЛОЖЬ.

Вы можете сказать, что bool ЕСТЬ стандарт, но очевидно, что он НЕ БЫЛ стандартом до C99, который был создан 10 лет назад;) Они добавили его тогда, когда стало очевидно, что отсутствует элемент.

1
ответ дан 27 November 2019 в 01:26
поделиться

Было обычным (и до сих пор в некоторых случаях) обрабатывать ноль как ложь, а любое ненулевое значение - как истину. У этого есть преимущества для сокращения: например, вместо while (Остающийся! = 0) вы можете просто использовать while (Остающийся) .

Некоторые языки стандартизированы на истинное бытие -1. Причина этого в том, что в нотации с дополнением до двух (которую большинство компьютеров используют для представления отрицательных чисел) побитовое не 0 равно -1 (в 8-битном двоичном формате 11111111 является десятичным -1) .

Со временем стало ясно, что использование константы, определяемой компилятором, предотвратит множество потенциальных путаниц. Прошло много времени с тех пор, как я изучал C ++, но я почти уверен, что любое ненулевое значение по-прежнему будет оценивать как «истину».

11
ответ дан 27 November 2019 в 01:26
поделиться

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

0
ответ дан 27 November 2019 в 01:26
поделиться

На самом деле C - это немного больше, чем язык ассемблера более высокого уровня. Да, в нем есть управляющие структуры и еще много чего, и даже есть типы, которые ассемблеру определенно не нужны.

Но язык был разработан несколько десятилетий назад. И поскольку каждый логический результат сводится к отдельным битам в слове состояния процессора, очевидно, было достаточно просто использовать для него интегральный тип данных. И это сделало компилятор, вероятно, немного менее сложным, поскольку вы можете опустить некоторую проверку типов (в более поздних языковых структурах управления требуется логическое значение, в C им просто нужно целое значение 0 или что-то еще).

17
ответ дан 27 November 2019 в 01:26
поделиться

Вероятно, исторические причины:

CPL, на который сильно повлиял АЛГОЛ, скорее всего, имел логический тип, но мой google-fu не достаточно найти ссылку на это. Но CPL был слишком амбициозным для своего времени, что привело к появлению урезанной версии под названием BCPL, которая имела то преимущество, что вы действительно могли реализовать его на доступном оборудовании.

BCPL имел только один тип - «слово» - который интерпретировался как ложный в логических контекстах, если 0 , и как истинный, если ~ 0 (имеется в виду дополнение к ] 0 , который будет представлять значение -1 , если интерпретируется как целое число со знаком в дополнительном коде). Интерпретация любого другого значения зависела от реализации.

После все еще бестипового преемника B, C повторно ввел систему типов, но на нее по-прежнему сильно влияла бестиповая природа своих предшественников.

4
ответ дан 27 November 2019 в 01:26
поделиться

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

Поскольку не было единственного действительно «правильного» ответа, они предоставили пользователю возможность принимать решение на основе требований программы, которую они писали.

Настоящий вопрос, таким образом, заключается в том, почему в C99 был добавлен логический тип. Я предполагаю, что здесь задействовано несколько факторов. Во-первых, они поняли, что удобочитаемость и удобство для программиста теперь обычно важнее, чем обеспечение максимально возможной производительности.Во-вторых, компиляторы теперь проводят более глобальный анализ, поэтому, по крайней мере, можно предположить, что кто-то может написать компилятор, который пытается выбрать представление, наиболее подходящее для конкретной программы (хотя я не знаю все, что действительно есть).

6
ответ дан 27 November 2019 в 01:26
поделиться

В старом C на самом деле не «отсутствовал» логический тип - просто все интегральные типы также считались подходящими для выполнения двойных функций - хранения логических значений. Я вижу две основные причины этого:

  • Процессоры с битовой адресацией не были распространены (и до сих пор не используются), поэтому компилятор не сможет использовать «истинный логический» тип для сохранения любых пробел - логическое значение все равно будет не меньше char (если вы надеетесь получить к нему эффективный доступ).

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

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

Помните, что в языке C есть набор операторов, которые производят логические результаты (заданные как 0 или 1) - ! , && , || , ! = , == , <, <= , > и > = - значит, здесь нет только специального логического типа.

5
ответ дан 27 November 2019 в 01:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: