Wikipedia, jak również inne źródła, które znalazłem, wskazują void
typ C jako typ jednostki, a nie typ pusty. Uważam to za mylące, ponieważ wydaje mi się, że void
lepiej pasuje do definicji typu pustego / dolnego.
void
O ile wiem, nie zamieszkują żadnych wartości .- Funkcja z typem zwracanym void określa, że funkcja nic nie zwraca, a zatem może wywołać tylko pewien efekt uboczny.
- Wskaźnik typu
void*
jest podtypem wszystkich innych typów wskaźników. Również konwersje do izvoid*
C są niejawne.
Nie jestem pewien, czy ostatni punkt ma jakąkolwiek wartość jako argument za void
byciem pustym typem, ponieważ void*
jest to mniej więcej szczególny przypadek z niewielkim stosunkiem void
.
Z drugiej strony void
sam nie jest podtypem wszystkich innych typów, co, o ile wiem, jest wymogiem, aby typ był typem dolnym.
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
Meta
źródło
źródło
Odpowiedzi:
W C
void
jest używany do wielu niepowiązanych rzeczy. W zależności od tego, do czego jest używany, może to oznaczać typ jednostki, typ pusty lub coś innego.Gdy0 20=1
void
jest używany samodzielnie (w przeciwieństwie dovoid*
wskaźnika do pustki), jest to typ jednostki, tj. Typ z jedną wartością.void
Mówi się, że funkcje, które zwracają , „nic nie zwracają”, ale tak naprawdę oznacza to, że nie zwracają żadnych informacji. Zwracają bitów informacji, co oznacza, że zwracają wartość typu, który zawiera odrębne wartości, tj. Typ jednostki.To nie jest pusty typ: funkcja zwracająca pusty typ nie może zwrócić wartości, ponieważ nie ma żadnej wartości tego typu. Funkcja, której typ zwracany jest pusty, może zapętlać na zawsze, przerywać program lub zgłaszać wyjątek (
longjmp
) (lub w inny sposób zapewniać brak powrotu, np. Poprzez przeniesienie kontroli do innego wątku lub procesu przy użyciu funkcjonalności wykraczającej poza standardowy C). Aby utrzymać zamieszanie, w C zwykle używa sięvoid
zamiast pustego typu (C nie ma pustego typu).void
Ten wymaga bitów przechowywania. Ponieważ C nalega, aby każdy obiekt zajmował całą niezerową liczbę bajtów pamięci, zabronione jest tworzenie obiektu typu i istnieje specjalna składnia zwracająca wartość ( instrukcja z pominiętą wartością). Nie ma składni, która daje wartość typu , ale ta wartość jest dostępna za każdym razem, gdy zwraca funkcję, której typ zwracany jest .void
void
return
void
void
C nie ma typu dolnego w tym sensie, że dopuszcza dowolny możliwy typ. Nawet niekompletne typy określają ogólny charakter jego wartości, np. Wskaźniki, struktury, związki lub funkcje. Ale
void*
jest wskaźnikiem do każdego typu non-funkcyjny: to najmniejszy element algebry typów obiektów wskaźnik, czyli jest to dolna typ obiektu wskaźnik. W przeciwieństwie do ogólnego przypadkuT*
, gdzieT
jest jakiś zakaz typ void,void*
nie jest typem wskaźników do wartości typuvoid
, ale rodzaj wskaźników do wartości nieokreślonego typu.źródło
void
jest niezdefiniowana, a nie zero. To nie jest powód, dla którego obiekty typuvoid
są niedozwolone. Formalne Powodem jest to, żevoid
jest niekompletny typ , a obiekty nie mogą mieć niekompletną typu.void
Typu wymaga bitów 0 składowania. To jest powód, dla którego projektanci C postanowili stworzyćvoid
niekompletny typ, w przeciwieństwie do zdefiniowania, że zajmuje on 0 bajtów pamięci (co miałoby duży wpływ na projekt języka) lub 1 bajt pamięci (co marnowałoby miejsce) .void
typu. Nie wspominając o tym, że te obiekty mogłyby aliasować wszystkie inne obiekty, więc faktyczne użycie i tak wyniesie zero.struct E { };
. W przypadku użycia jako klasy bazowej może mieć rozmiar zero. (Naprawdę nie ma czegoś takiego jak C / C ++, dwa języki dokonują własnych wyborów i mogą się różnić w tych obszarach. C oczywiście nie ma pustych klas podstawowych, ponieważ nie ma OO w pierwszej kolejności)Nazwa „pusty typ” może być myląca. Oznacza to, jak sam twierdzisz, że typ nie zawiera żadnych wartości . „Pusty” nie odnosi się do żadnych indywidualnych wartości typu, odnosi się do typu jako całości, traktowanego jako zbiór możliwych wartości. Więc to nie nie powiedzieć coś w stylu „funkcja powrocie
void
nie zwraca informacji”, ale „nie istnieje żadnej wartości typu⊥
”.Oznacza to funkcję, której typ wyniku nigdy nie
⊥
może zostać zakończony. Gdyby się skończyło, musiałbym zwrócić wartość , ale cóż, taka wartość nie istnieje.⊥
Oznacza to również, że nie można nawet omówić, ile informacji zawiera wartość pustego typu, ponieważ nie ma takiej wartości. (Lub, jeśli wolisz, bezsensowne stwierdzenie, takie jak: „każda wartość pustego typu zawiera dokładnie 35093658 bitów informacji” jest bez wątpienia prawdziwe.) Przydatne (choć niezupełnie poprawne) jest myślenie o
⊥
wartościach zawierających nieskończoną ilość informacji.Podczas gdy funkcja C z „typem zwrotu”
void
wyraźnie może zwrócić, ale nie daje żadnych informacji w jej wartości zwracanej. Cóż, właśnie to charakteryzuje typ jednostki: jego wartości nie zawierają żadnych informacji, ponieważ istnieje tylko jedna taka wartość (stąd zawsze możesz powiedzieć, jaka będzie wartość zwracana, nawet bez zawracania głowy wywołaniem funkcji).Cytując Conora McBride'a (w transliteracji do C):
źródło