Wikipedia serta sumber lain yang saya temukan daftar void
tipe C sebagai tipe unit sebagai lawan dari tipe kosong. Saya menemukan ini membingungkan karena menurut saya void
lebih cocok dengan definisi tipe kosong / bawah.
- Tidak ada nilai yang dihuni
void
, sejauh yang saya tahu. - Suatu fungsi dengan tipe kembali dari kekosongan menentukan bahwa fungsi tidak mengembalikan apa pun dan dengan demikian hanya dapat melakukan beberapa efek samping.
- Pointer tipe
void*
adalah subtipe dari semua tipe pointer lainnya. Juga, konversi ke dan darivoid*
dalam C adalah implisit.
Saya tidak yakin apakah poin terakhir memiliki kelebihan sebagai argumen untuk void
menjadi tipe kosong, seperti void*
lebih atau kurang kasus khusus dengan tidak banyak hubungannya dengan void
.
Di sisi lain, void
itu sendiri bukan subtipe dari semua jenis lainnya, yang sejauh yang saya tahu adalah persyaratan untuk jenis menjadi tipe bawah.
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
sumber
sumber
Jawaban:
Dalam C,
void
digunakan untuk banyak hal yang tidak terkait. Bergantung pada apa yang digunakan untuk itu, artinya mungkin tipe unit, tipe kosong, atau sesuatu yang lain.Ketika0 20= 1
void
digunakan dengan sendirinya (sebagai lawan darivoid*
, pointer ke void), itu adalah tipe unit, yaitu tipe dengan nilai tunggal. Fungsi yang mengembalikanvoid
dikatakan “tidak menghasilkan apa-apa”, tetapi yang sebenarnya berarti adalah bahwa mereka tidak mengembalikan informasi apa pun. Mereka mengembalikan bit informasi, yang berarti bahwa mereka mengembalikan nilai dari tipe yang mengandung 2 0 = 1 nilai yang berbeda, yaitu tipe unit.Ini bukan tipe kosong: fungsi yang mengembalikan tipe kosong tidak dapat mengembalikan nilai, karena tidak ada nilai tipe itu. Fungsi yang tipe pengembaliannya kosong hanya dapat diulang selamanya, atau dibatalkan programnya, atau menimbulkan pengecualian (
longjmp
) (atau mengatur agar tidak kembali, misalnya dengan mentransfer kontrol ke utas lain atau proses menggunakan fungsionalitas di luar standar C). Untuk membuat hal-hal membingungkan, itu konvensional dalam C untuk digunakanvoid
sebagai pengganti tipe kosong (C tidak memiliki tipe kosong).The0
void
Tipe membutuhkan bit penyimpanan. Karena C bersikeras pada setiap objek yang menempati keseluruhan, jumlah byte penyimpanan yang tidak nol, dilarang membuat objek bertipe , dan ada sintaks khusus untuk mengembalikan nilai ( pernyataan dengan nilai yang dihilangkan). Tidak ada sintaks yang menghasilkan nilai tipe , tetapi nilai itu ada setiap kali fungsi yang tipe pengembaliannya dikembalikan.void
void
return
void
void
C tidak memiliki tipe dasar dalam arti memungkinkan tipe apa pun yang mungkin. Bahkan tipe yang tidak lengkap menentukan sifat umum dari nilai-nilainya, misalnya pointer atau struct atau serikat atau fungsi. Tetapi
void*
adalah pointer ke semua jenis non-fungsi: itu adalah elemen paling sedikit dari aljabar jenis pointer objek, yaitu itu adalah tipe pointer objek bawah. Berbeda dengan kasus umum diT*
manaT
ada beberapa tipe non-void,void*
bukan tipe pointer ke nilai tipevoid
, tetapi tipe pointer ke nilai tipe yang tidak ditentukan.sumber
void
tidak ditentukan, bukan nol. Ini bukan alasan mengapa objek bertipevoid
tidak diizinkan. Alasan formal adalah bahwa ituvoid
adalah tipe yang tidak lengkap , dan objek tidak dapat memiliki tipe yang tidak lengkap.void
Tipe membutuhkan 0 bit penyimpanan. Ini adalah alasan mengapa para perancang C memutuskan untuk membuatvoid
tipe yang tidak lengkap, sebagai lawan dari mendefinisikannya mengambil 0 byte penyimpanan (yang akan memiliki banyak dampak pada desain bahasa) atau 1 byte penyimpanan (yang akan membuang-buang ruang) .void
tipe. Belum lagi benda-benda ini bisa alias semua benda lain, jadi penggunaan sebenarnya akan menjadi nol.struct E { };
. Ketika digunakan sebagai kelas dasar, ini bisa berukuran nol. (Benar-benar tidak ada yang namanya C / C ++, kedua bahasa membuat pilihan mereka sendiri dan mereka dapat berbeda di daerah ini. C jelas tidak memiliki kelas dasar yang kosong, karena tidak memiliki OO di tempat pertama)Nama "tipe kosong" mungkin membingungkan. Apa artinya ini, seperti yang Anda katakan sendiri, jenisnya tidak mengandung nilai . "Kosong" mengacu bukan pada nilai individu dari jenis, itu mengacu pada jenis secara keseluruhan, dianggap sebagai ~ set nilai yang mungkin. Jadi ini tidak mengatakan sesuatu seperti "fungsi yang
void
mengembalikan tidak ada informasi", tetapi "tidak ada nilai tipe⊥
".Ini berarti suatu fungsi yang tipe hasilnya tidak pernah
⊥
dapat berakhir. Jika itu benar-benar berakhir, jika harus mengembalikan nilai , tetapi, well, nilai seperti itu tidak ada.⊥
Ini juga berarti, bahkan tidak mungkin untuk membahas berapa banyak informasi yang akan berisi nilai dari tipe kosong, karena tidak ada nilai seperti itu. (Atau jika Anda mau, pernyataan tidak masuk akal seperti "nilai apa pun dari jenis kosong mengandung persis 35093658 bit informasi" adalah benar-benar kosong.) Agak berguna (meskipun tidak benar-benar benar) untuk menganggap
⊥
nilai mengandung informasi yang tak terbatas .Sedangkan fungsi C dengan "tipe pengembalian"
void
jelas dapat kembali, tetapi tidak memberi Anda informasi dalam nilai pengembaliannya. Ya, itulah yang menjadi ciri khas tipe unit: nilainya tidak mengandung informasi apa pun, karena hanya ada satu nilai seperti itu (maka Anda selalu dapat mengatakan apa nilai pengembaliannya, bahkan tanpa repot-repot memanggil fungsi).Mengutip Conor McBride (diterjemahkan ke C):
sumber