Википедия, а также другие источники, которые я обнаружил в списке void
типа C как тип единицы, а не пустой тип. Мне кажется, что это сбивает с толку, так как мне кажется, что оно void
лучше подходит под определение пустого / нижнего типа
void
Насколько я могу судить, ценности не обитают .- Функция с возвращаемым типом void указывает, что функция ничего не возвращает и, следовательно, может выполнять только некоторый побочный эффект.
- Указатель типа
void*
является подтипом всех других типов указателей. Кроме того, преобразования в и изvoid*
в C являются неявными.
Я не уверен, имеет ли последняя точка какую-либо ценность в качестве аргумента для void
того, чтобы быть пустым типом, так как void*
это более или менее особый случай, не имеющий большого отношения к void
.
С другой стороны, void
сам по себе не является подтипом всех других типов, что, насколько я могу судить, является требованием, чтобы тип был нижним типом.
type-theory
c
logic
modal-logic
coq
equality
coinduction
artificial-intelligence
computer-architecture
compilers
asymptotics
formal-languages
asymptotics
landau-notation
asymptotics
turing-machines
optimization
decision-problem
rice-theorem
algorithms
arithmetic
floating-point
automata
finite-automata
data-structures
search-trees
balanced-search-trees
complexity-theory
asymptotics
amortized-analysis
complexity-theory
graphs
np-complete
reductions
np-hard
algorithms
string-metrics
computability
artificial-intelligence
halting-problem
turing-machines
computation-models
graph-theory
terminology
complexity-theory
decision-problem
polynomial-time
algorithms
algorithm-analysis
optimization
runtime-analysis
loops
turing-machines
computation-models
recurrence-relation
master-theorem
complexity-theory
asymptotics
parallel-computing
landau-notation
terminology
optimization
decision-problem
complexity-theory
polynomial-time
counting
coding-theory
permutations
encoding-scheme
error-correcting-codes
machine-learning
natural-language-processing
algorithms
graphs
social-networks
network-analysis
relational-algebra
constraint-satisfaction
polymorphisms
algorithms
graphs
trees
Мета
источник
источник
Ответы:
В C
void
используется для нескольких несвязанных вещей. В зависимости от того, для чего он используется, его значением может быть тип единицы, пустой тип или что-то еще.void
void*
void
Это не пустой тип: функция, которая возвращает пустой тип, не может возвращать значение, так как нет значения этого типа. Функция с возвращаемым пустым типом может только зацикливаться навсегда, или прерывать программу, или вызывать исключение (
longjmp
) (или иначе договариваться о невозможности возврата, например, путем передачи управления другому потоку или процессу с использованием функциональных возможностей, выходящих за рамки стандартного C). Чтобы сбить с толку, в C принято использоватьvoid
вместо пустого типа (C не имеет пустого типа).void
void
void
return
void
void
C не имеет нижнего типа в смысле разрешения любого возможного типа. Даже неполные типы определяют общую природу его значений, например указателей или структур, объединений или функций. Но
void*
это указатель на любой нефункциональный тип: это наименьший элемент алгебры типов указателей на объекты, т.е. это нижний тип указателя на объект. В отличие от общего случая,T*
гдеT
используется некоторый тип, отличный от void,void*
это не тип указателей на значение типаvoid
, а тип указателей на значение неопределенного типа.источник
void
неопределен, а не ноль. Это не причина, почему объекты типаvoid
запрещены. Формальная причина в том, чтоvoid
это неполный тип , и объекты не могут иметь неполный тип.void
Типа требует 0 бит хранения. Это причина, по которой разработчики C решили создатьvoid
неполный тип, в отличие от определения, что он занимает 0 байт памяти (что будет иметь большое влияние на структуру языка) или 1 байт памяти (что приведет к потере места). ,void
типа. Не говоря уже о том, что эти объекты могут иметь псевдонимы для всех других объектов, поэтому фактическое использование будет равно нулю.struct E { };
. При использовании в качестве базового класса это может быть нулевого размера. (На самом деле нет такой вещи, как C / C ++, два языка делают свой выбор, и они могут различаться в этих областях. Очевидно, C не имеет пустых базовых классов, поскольку в первую очередь не имеет ОО)Название «пустой тип», возможно, сбивает с толку. Это означает, что, как вы говорите сами, тип не содержит значений . «Пустой» относится не к каким-либо отдельным значениям типа, а к типу в целом, который рассматривается как набор возможных значений. Таким образом, это не говорит что-то вроде «функция,
void
возвращающая информацию не возвращает», но «не существует значения типа⊥
».Это означает, что функция, тип результата которой никогда не
⊥
может завершаться. Если бы он завершился, если бы пришлось вернуть значение , но, ну, такого значения не существует.⊥
Это также означает, что даже невозможно обсудить, сколько информации будет содержать значение пустого типа, потому что такого значения нет. (Или, если хотите, бессмысленное утверждение типа «любое значение пустого типа содержит ровно 35093658 битов информации» является пусто верным.) Несколько полезно (хотя и не совсем правильно) думать о
⊥
значениях как о бесконечном количестве информации.В то время как функция C с «возвратного типа»
void
явно может вернуться, но не дает никакой информации в ее возвращаемое значение. Что ж, это именно то, что характеризует тип модуля: его значения не содержат никакой информации, потому что существует только одно такое значение (следовательно, вы всегда можете сказать, каким будет возвращаемое значение, даже не удосужившись когда-либо вызвать функцию).Процитирую Конора Макбрайда (транслитерировано на C):
источник