Wikipedia, así como otras fuentes que he encontrado, enumeran el void
tipo de C como un tipo de unidad en lugar de un tipo vacío. Esto me parece confuso, ya que me parece que se void
ajusta mejor a la definición de un tipo vacío / inferior.
- No habito valores
void
, por lo que puedo decir. - Una función con un tipo de retorno de vacío especifica que la función no devuelve nada y, por lo tanto, solo puede realizar algún efecto secundario.
- Un puntero de tipo
void*
es un subtipo de todos los demás tipos de puntero. Además, las conversiones hacia y desdevoid*
C son implícitas.
No estoy seguro de si el último punto tiene algún mérito como argumento para void
ser un tipo vacío, ya que void*
es más o menos un caso especial con poca relación void
.
Por otro lado, en void
sí mismo no es un subtipo de todos los demás tipos, lo que, por lo que puedo decir, es un requisito para que un tipo sea de tipo inferior.
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
fuente
fuente
Respuestas:
En C,
void
se usa para múltiples cosas no relacionadas. Dependiendo de para qué se use, su significado puede ser un tipo de unidad, un tipo vacío u otra cosa.void
void*
void
Este no es un tipo vacío: una función que devuelve un tipo vacío no puede devolver un valor, ya que no hay ningún valor de ese tipo. Una función cuyo tipo de retorno está vacío solo puede recorrer en bucle para siempre, o abortar el programa, o generar una excepción (
longjmp
) (u organizar de otro modo para no regresar, por ejemplo, transfiriendo el control a otro hilo o proceso usando una funcionalidad más allá del estándar C). Para mantener las cosas confusas, es convencional en C usarvoid
en lugar de un tipo vacío (C no tiene un tipo vacío).void
void
void
return
void
void
C no tiene un tipo de fondo en el sentido de permitir cualquier tipo posible. Incluso los tipos incompletos especifican la naturaleza general de sus valores, por ejemplo, punteros o estructuras o uniones o funciones. Pero
void*
es un puntero a cualquier tipo sin función: es el elemento mínimo del álgebra de los tipos de puntero de objeto, es decir, es el tipo de puntero de objeto inferior. A diferencia del caso general deT*
dóndeT
hay algún tipo no nulo,void*
no es el tipo de punteros a un valor de tipovoid
, sino el tipo de punteros a un valor de tipo no especificado.fuente
void
es indefinida, no cero. Esta no es la razón por la cual los objetos de tipovoid
no están permitidos. La razón formal es quevoid
es un tipo incompleto y los objetos no pueden tener un tipo incompleto.void
tipo requiere 0 bits de almacenamiento. Esta es la razón por la cual los diseñadores de C decidieron hacervoid
un tipo incompleto, en lugar de definirlo tomando 0 bytes de almacenamiento (lo que tendría un gran impacto en el diseño del lenguaje) o 1 byte de almacenamiento (lo que desperdiciaría espacio) .void
tipo. Sin mencionar que estos objetos podrían alias a todos los demás objetos, por lo que el uso real sería cero de todos modos.struct E { };
. Cuando se usa como una clase base, puede ser de tamaño cero. (Realmente no existe tal cosa como C / C ++, los dos idiomas toman sus propias decisiones y pueden diferir en estas áreas. C obviamente no tiene clases base vacías, ya que no tiene OO en primer lugar)El nombre "tipo vacío" es quizás confuso. Lo que esto significa es, como usted mismo dice, el tipo no contiene valores . El "vacío" no se refiere a ningún valor individual del tipo, se refiere al tipo como un todo, considerado como un conjunto de valores posibles. Por lo tanto, esto no dice algo como "una función que
void
devuelve no devuelve información", sino "no existe ningún valor de tipo⊥
".Esto significa que una función cuyo tipo de resultado es nunca
⊥
puede terminar. Si terminara, tendría que devolver un valor de , pero, bueno, ese valor no existe.⊥
También significa que ni siquiera es posible discutir cuánta información contendría un valor de tipo vacío, porque no existe tal valor. (O, si lo desea, una afirmación sin sentido como "cualquier valor de tipo vacío contiene exactamente 35093658 bits de información" es completamente cierto). Es algo útil (aunque no realmente correcto) pensar que los
⊥
valores contienen una cantidad infinita de información.Mientras que una función C con "tipo de retorno"
void
claramente puede regresar, pero no le da ninguna información en su valor de retorno. Bueno, eso es precisamente lo que caracteriza un tipo de unidad: sus valores no contienen ninguna información, porque solo hay uno de esos valores (por lo tanto, siempre puede decir cuál será el valor de retorno, incluso sin molestarse en llamar a la función).Para citar a Conor McBride (transcrito a C):
fuente