Wikipedia und andere Quellen, die ich gefunden habe, listen den void
Typ C als Einheitentyp und nicht als leeren Typ auf. Ich finde das verwirrend, da es mir so scheint, als ob es void
besser zur Definition eines Leer- / Bodentyps passt.
void
Soweit ich das beurteilen kann, gibt es keine Werte .- Eine Funktion mit dem Rückgabetyp void gibt an, dass die Funktion nichts zurückgibt und daher nur einige Nebenwirkungen verursachen kann.
- Ein Zeiger vom Typ
void*
ist ein Subtyp aller anderen Zeigertypen. Konvertierungen von und nachvoid*
in C sind ebenfalls implizit.
Ich bin mir nicht sicher, ob der letzte Punkt als Argument für void
einen leeren Typ von Belang ist, da void*
es sich mehr oder weniger um einen Sonderfall handelt, zu dem nicht viel Bezug besteht void
.
Andererseits ist er void
selbst kein Untertyp aller anderen Typen, was meines Erachtens eine Voraussetzung dafür ist, dass ein Typ ein unterer Typ ist.
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
quelle
quelle
Antworten:
In C
void
wird für mehrere nicht miteinander verbundene Dinge verwendet. Je nachdem, wofür es verwendet wird, kann seine Bedeutung ein Einheitentyp, ein leerer Typ oder etwas anderes sein.Wenn0 20=1
void
es von sich aus verwendet wird (im Gegensatz zuvoid*
einem Zeiger auf void), ist es ein Einheitentyp, dh ein Typ mit einem einzelnen Wert. Von zurückgegebenen Funktionenvoid
wird gesagt, dass sie „nichts zurückgeben“. Dies bedeutet jedoch, dass sie keine Informationen zurückgeben. Sie geben Informationsbits zurück, was bedeutet, dass sie einen Wert eines Typs zurückgeben, der verschiedene Werte enthält, dh einen Einheitentyp.Dies ist kein leerer Typ: Eine Funktion, die einen leeren Typ zurückgibt, kann keinen Wert zurückgeben, da es keinen Wert dieses Typs gibt. Eine Funktion, deren Rückgabetyp leer ist, kann nur eine Endlosschleife ausführen, das Programm abbrechen oder eine Ausnahme auslösen (
longjmp
) (oder auf andere Weise festlegen, dass keine Rückgabe erfolgt, z. B. durch Übertragung der Steuerung auf einen anderen Thread oder Prozess mit Funktionen, die über Standard C hinausgehen). Um die Dinge nicht zu verwirren, ist es in C üblich,void
anstelle eines leeren Typs einen leeren Typ zu verwenden (C hat keinen leeren Typ).Der0
void
Typ erfordert Speicherbits. Da C darauf besteht, dass jedes Objekt eine ganze, von Null verschiedene Anzahl von Speicherbytes belegt, ist es verboten, ein Objekt vom Typ zu erstellen , und es gibt eine spezielle Syntax, um den Wert zurückzugeben (eine Anweisung, bei der der Wert weggelassen wird). Es gibt keine Syntax, die den Wert von type liefert , aber dieser Wert ist immer dann vorhanden, wenn eine Funktion, deren Rückgabetyp "return" ist, zurückgibt.void
void
return
void
void
C hat keinen Bottom-Typ im Sinne eines möglichen Typs. Auch unvollständige Typen geben die allgemeine Natur ihrer Werte an, z. B. Zeiger oder Strukturen oder Vereinigungen oder Funktionen. Ist
void*
aber ein Zeiger auf einen beliebigen Nicht-Funktionstyp: Es ist das kleinste Element der Algebra von Objektzeigertypen, dh es ist der unterste Objektzeigertyp. Im Gegensatz zum allgemeinen Fall,T*
dassT
es sich bei einem Typ um einen nicht leeren Typ handelt,void*
handelt es sich nicht um den Typ der Zeiger auf einen Wert vom Typvoid
, sondern um den Typ der Zeiger auf einen Wert vom nicht angegebenen Typ.quelle
void
undefiniert und nicht null. Dies ist nicht der Grund, warum Objekte vom Typvoid
nicht zulässig sind. Der formale Grund ist, dassvoid
es sich um einen unvollständigen Typ handelt und Objekte keinen unvollständigen Typ haben können.void
Typ erfordert 0 Speicherbits. Dies ist der Grund, warum die Designer von C beschlossen haben,void
einen unvollständigen Typ zu erstellen, anstatt zu definieren, dass 0 Byte Speicher (was sich stark auf das Sprachdesign auswirken würde) oder 1 Byte Speicher (was Platz verschwenden würde) benötigt werden. .void
Typ " void" . Ganz zu schweigen davon, dass diese Objekte alle anderen Objekte als Alias verwenden könnten, sodass die tatsächliche Verwendung ohnehin null wäre.struct E { };
. Bei Verwendung als Basisklasse kann dies eine Größe von Null haben. (Es gibt wirklich kein C / C ++, die beiden Sprachen treffen ihre eigenen Entscheidungen und können sich in diesen Bereichen unterscheiden. C hat offensichtlich keine leeren Basisklassen, da es überhaupt keine OO hat.)Der Name "leerer Typ" ist vielleicht verwirrend. Dies bedeutet, wie Sie selbst sagen, dass der Typ keine Werte enthält . Die Angabe "leer" bezieht sich nicht auf einzelne Werte des Typs, sondern auf den gesamten Typ, der als ~ Menge möglicher Werte betrachtet wird. Das bedeutet also nicht so etwas wie "Eine Funktion, die
void
zurückgibt, gibt keine Informationen zurück", sondern "Es gibt keinen Wert vom Typ⊥
".Dies bedeutet eine Funktion , deren Ergebnistyp
⊥
kann nie enden. Wenn es beendet würde, müsste ein Wert von zurückgegeben werden⊥
, aber nun, ein solcher Wert existiert nicht.Dies bedeutet auch, dass nicht einmal diskutiert werden kann, wie viele Informationen ein leerer Wert enthalten würde, da es keinen solchen Wert gibt. (Wenn Sie so wollen, ist eine unsinnige Aussage wie „jeder Wert eines leeren Typs enthält genau 35093658 Informationsbits“ vakuumtreu.) Es ist einigermaßen nützlich (wenn auch nicht wirklich korrekt), sich
⊥
Werte als unendlich viele Informationen enthaltend vorzustellen .Während eine C-Funktion mit "return type"
void
eindeutig zurückgeben kann , gibt sie in ihrem Rückgabewert keine Informationen aus. Genau das zeichnet einen Einheitentyp aus: Seine Werte enthalten keine Informationen, da es nur einen solchen Wert gibt (daher können Sie immer sagen, wie hoch der Rückgabewert sein wird, auch ohne sich die Mühe zu machen, die Funktion jemals aufzurufen).Um Conor McBride (transliteriert nach C) zu zitieren :
quelle