Wikipédia ainsi que d'autres sources que j'ai trouvées listent le void
type C comme type d'unité par opposition à un type vide. Je trouve cela déroutant car il me semble que cela void
correspond mieux à la définition d'un type vide / bas.
- Autant
void
que je sache , aucune valeur n'habite . - Une fonction avec un type de retour void spécifie que la fonction ne retourne rien et ne peut donc effectuer que des effets secondaires.
- Un pointeur de type
void*
est un sous-type de tous les autres types de pointeurs. De plus, les conversions vers et depuisvoid*
en C sont implicites.
Je ne sais pas si le dernier point a un quelconque mérite comme argument pour void
être un type vide, comme void*
c'est plus ou moins un cas spécial avec peu de relation avec void
.
D'un autre côté, void
lui-même n'est pas un sous-type de tous les autres types, ce qui, pour autant que je sache, est une exigence pour qu'un type soit un type inférieur.
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
la source
la source
Réponses:
En C,
void
est utilisé pour plusieurs choses sans rapport. En fonction de son utilisation, sa signification peut être un type d'unité, un type vide ou autre chose.void
void*
void
Ce n'est pas un type vide: une fonction qui retourne un type vide ne peut pas retourner une valeur, car il n'y a pas de valeur de ce type. Une fonction dont le type de retour est vide ne peut que boucler indéfiniment, ou abandonner le programme, ou lever une exception (
longjmp
) (ou autrement prendre des dispositions pour ne pas revenir, par exemple en transférant le contrôle vers un autre thread ou processus en utilisant des fonctionnalités au-delà du standard C). Pour éviter toute confusion, il est classique en C d'utiliservoid
à la place d'un type vide (C n'a pas de type vide).void
void
void
return
void
void
C n'a pas de type bas dans le sens d'autoriser tout type possible. Même les types incomplets spécifient la nature générale de ses valeurs, par exemple des pointeurs ou des structures ou des unions ou des fonctions. Mais
void*
est un pointeur vers n'importe quel type de non-fonction: c'est le moindre élément de l'algèbre des types de pointeurs d'objets, c'est-à-dire que c'est le type de pointeur d'objet inférieur. Contrairement au cas généralT*
où seT
trouve un type non vide, cevoid*
n'est pas le type de pointeurs vers une valeur de typevoid
, mais le type de pointeurs vers une valeur de type non spécifié.la source
void
n'est pas définie, pas zéro. Ce n'est pas la raison pour laquelle les objets de typevoid
sont interdits. La raison formelle est qu'ilvoid
s'agit d'un type incomplet et que les objets ne peuvent pas avoir un type incomplet.void
type nécessite 0 bits de stockage. C'est la raison pour laquelle les concepteurs de C ont décidé de fairevoid
un type incomplet, au lieu de le définir en prenant 0 octets de stockage (ce qui aurait beaucoup d'impact sur la conception du langage) ou 1 octet de stockage (ce qui gaspillerait de l'espace) .void
type. Sans oublier que ces objets pourraient alias tous les autres objets, donc l'utilisation réelle serait de toute façon nulle.struct E { };
. Lorsqu'elle est utilisée comme classe de base, elle peut être de taille nulle. (Il n'y a vraiment rien de tel que C / C ++, les deux langages font leurs propres choix et ils peuvent différer dans ces domaines. C n'a évidemment pas de classes de base vides, car il n'a pas OO en premier lieu)Le nom «type vide» prête peut-être à confusion. Cela signifie que, comme vous le dites vous-même, le type ne contient aucune valeur . Le «vide» ne fait référence à aucune valeur individuelle du type, il fait référence au type dans son ensemble, considéré comme un ~ ensemble de valeurs possibles. Donc, cela ne dit pas quelque chose comme «une fonction renvoyant
void
ne renvoie aucune information», mais «il n'existe aucune valeur de type⊥
».Cela signifie qu'une fonction dont le type de résultat est ne
⊥
peut jamais se terminer. S'il s'est terminé, il devrait renvoyer une valeur de⊥
, mais bon, une telle valeur n'existe pas.Cela signifie également qu'il n'est même pas possible de discuter de la quantité d'informations qu'une valeur de type vide contiendrait, car il n'y a pas une telle valeur. (Ou si vous voulez, une déclaration absurde comme «toute valeur de type vide contient exactement 35093658 bits d'informations» est tout à fait vraie.) Il est quelque peu utile (mais pas vraiment correct) de penser que les
⊥
valeurs contiennent une quantité infinie d'informations.Alors qu'une fonction C avec «type de retour» peut
void
clairement retourner, mais ne vous donne aucune information dans sa valeur de retour. Eh bien, c'est précisément ce qui caractérise un type d'unité: ses valeurs ne contiennent aucune information, car il n'y a qu'une seule de ces valeurs (vous pouvez donc toujours dire quelle sera la valeur de retour, même sans prendre la peine d'appeler la fonction).Pour citer Conor McBride (translittéré en C):
la source