A Wikipedia e outras fontes que eu encontrei listam o void
tipo de C como um tipo de unidade, em vez de um tipo vazio. Acho isso confuso, pois me parece que void
melhor se ajusta à definição de um tipo vazio / inferior.
- Nenhum valor habita
void
, até onde eu sei. - Uma função com um tipo de retorno de nulo especifica que a função não retorna nada e, portanto, só pode executar algum efeito colateral.
- Um ponteiro do tipo
void*
é um subtipo de todos os outros tipos de ponteiros. Além disso, as conversões de evoid*
para C estão implícitas.
Não tenho certeza se o último ponto tem algum mérito como argumento por void
ser do tipo vazio, como void*
é mais ou menos um caso especial com pouca relação com void
.
Por outro lado, void
ele próprio não é um subtipo de todos os outros tipos, o que, até onde eu sei, é um requisito para que um tipo seja do 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
fonte
fonte
Respostas:
Em C,
void
é usado para várias coisas não relacionadas. Dependendo do uso, seu significado pode ser um tipo de unidade, um tipo vazio ou qualquer outra coisa.Quando0 20=1
void
é usado por si só (ao contrário devoid*
um ponteiro para anular), é um tipo de unidade, ou seja, um tipo com um único valor.void
Diz-se que as funções que retornam "não retornam nada", mas o que isso realmente significa é que elas não retornam nenhuma informação. Eles retornam bits de informação, o que significa que retornam um valor de um tipo que contém valores distintos, ou seja, um tipo de unidade.2 0 = 1Este não é um tipo vazio: uma função que retorna um tipo vazio não pode retornar um valor, pois não há valor desse tipo. Uma função cujo tipo de retorno está vazio pode fazer loop apenas para sempre, ou abortar o programa, ou gerar uma exceção (
longjmp
) (ou de outra forma organizar para não retornar, por exemplo, transferindo o controle para outro thread ou processo usando a funcionalidade além do padrão C). Para manter as coisas confusas, é convencional em C usarvoid
no lugar de um tipo vazio (C não tem um tipo vazio).O0
void
tipo requer bits de armazenamento. Como C insiste em todos os objetos que ocupam um número inteiro e nulo de bytes de armazenamento, é proibido criar um objeto do tipo e há uma sintaxe especial para retornar o valor (uma declaração com o valor omitido). Não há sintaxe que produz o valor do tipo , mas esse valor existe sempre que uma função cujo tipo de retorno é retornado.void
void
return
void
void
C não possui um tipo inferior no sentido de permitir qualquer tipo possível. Mesmo tipos incompletos especificam a natureza geral de seus valores, por exemplo, ponteiros ou estruturas, uniões ou funções. Mas
void*
é um ponteiro para qualquer tipo que não seja de função: é o menor elemento da álgebra dos tipos de ponteiros de objetos, ou seja, é o tipo de ponteiro de objeto inferior. Ao contrário do caso geral deT*
ondeT
é algum tipo não nulo,void*
não é o tipo de ponteiros para um valor do tipovoid
, mas o tipo de ponteiros para um valor do tipo não especificado.fonte
void
é indefinida, não zero. Esta não é a razão pela qual objetos do tipovoid
não são permitidos. A razão formal é que essevoid
é um tipo incompleto e os objetos não podem ter um tipo incompleto.void
tipo requer 0 bits de armazenamento. Essa é a razão pela qual os designers de C decidiram criarvoid
um tipo incompleto, em vez de defini-lo usando 0 bytes de armazenamento (o que teria muito impacto no design da linguagem) ou 1 byte de armazenamento (o que desperdiçaria espaço) .void
tipo. Sem mencionar que esses objetos poderiam alias todos os outros objetos, portanto o uso real seria zero de qualquer maneira.struct E { };
. Quando usado como uma classe base, isso pode ser de tamanho zero. (Não existe realmente C / C ++, as duas linguagens fazem suas próprias escolhas e podem diferir nessas áreas. C obviamente não possui classes base vazias, pois não possui OO em primeiro lugar)O nome "tipo vazio" talvez seja confuso. O que isso significa é que, como você diz, o tipo não contém valores . O "vazio" não se refere a nenhum valor individual do tipo, refere-se ao tipo como um todo, considerado como um conjunto de valores possíveis. Portanto, isso não diz algo como "uma função retornando
void
não retorna informações", mas "não existe valor do tipo⊥
".Isso significa que uma função cujo tipo de resultado é nunca
⊥
pode terminar. Se ele terminou, se precisaria retornar um valor de , mas, bem, esse valor não existe.⊥
Também significa que não é possível discutir quanta informação um valor do tipo vazio conteria, porque não existe esse valor. (Ou, se preferir, uma declaração sem sentido como "qualquer valor do tipo vazio contém exatamente 35093658 bits de informação" é vacuamente verdadeira.) É um pouco útil (embora não seja realmente correto) pensar em
⊥
valores como contendo uma quantidade infinita de informações.Enquanto uma função C com "tipo de retorno"
void
claramente pode retornar, mas não fornece nenhuma informação em seu valor de retorno. Bem, é exatamente isso que caracteriza um tipo de unidade: seus valores não contêm nenhuma informação, porque existe apenas um valor (portanto, você sempre pode dizer qual será o valor de retorno, mesmo sem se preocupar em chamar a função).Para citar Conor McBride (transliterado para C):
fonte