Mencari untuk mendapatkan dasar-dasar dari mana istilah " void " berasal, dan mengapa itu disebut void. Maksud dari pertanyaan ini adalah untuk membantu seseorang yang tidak memiliki pengalaman C, dan tiba-tiba melihat basis kode berbasis C.
c#
c++
c
language-design
terminology
Nick Katsivelos
sumber
sumber
Jawaban:
Pada dasarnya itu berarti "tidak ada" atau "tidak ada tipe"
Ada 3 cara dasar yang digunakan untuk membatalkan:
Argumen fungsi:
int myFunc(void)
- fungsi tidak mengambil apa pun.Nilai
void myFunc(int)
pengembalian fungsi : - fungsi tidak mengembalikan apa punPenunjuk data umum:
void* data
- 'data' adalah penunjuk ke data dengan tipe yang tidak dikenal, dan tidak dapat ditinjau ulangCatatan:
void
argumen fungsi dalam adalah opsional di C ++, jadiint myFunc()
persis sama denganint myFunc(void)
, dan ditinggalkan sepenuhnya dalam C #. Itu selalu diperlukan untuk nilai kembali.sumber
Saya selalu menganggapnya absen . Berikut adalah empat kasus dalam bahasa C yang cocok dengan penggunaan absen ini
R f(void)
- Parameter fungsi tidak adavoid f(P)
- Nilai pengembalian tidak adavoid *p
- Jenis yang ditunjuk tidak ada(void) p
- Penggunaan nilai tidak adaKeturunan C lainnya menggunakannya untuk hal lain. Bahasa
D
pemrograman menggunakannya untuk kasus-kasus di mana inisialisasi tidak adaT t = void;
- nilai inisialisasi tidak adasumber
(void)p
harus dilakukan Saya tidak mengerti apa yang Anda maksud dengan "penggunaan nilai tidak ada."(void) var;
pernyataan itu, saya telah menemukan jawaban terinci di stackoverflow.com/q/21045615 .Ada dua cara untuk menggunakan void:
atau
Yang pertama menunjukkan bahwa tidak ada argumen yang diajukan atau tidak ada argumen yang dikembalikan.
Yang kedua memberitahu kompiler bahwa tidak ada tipe yang terkait dengan data secara efektif yang berarti bahwa Anda tidak dapat menggunakan data yang ditunjukkan sampai itu dilemparkan ke tipe yang dikenal.
Misalnya Anda akan melihat
void*
banyak digunakan ketika Anda memiliki antarmuka yang memanggil fungsi yang parameternya tidak dapat diketahui sebelumnya.Sebagai contoh, di Linux Kernel ketika menunda pekerjaan Anda akan mengatur fungsi yang akan dijalankan pada waktu yang terakhir dengan memberikannya sebuah pointer ke fungsi yang akan dijalankan dan sebuah pointer ke data yang akan diteruskan ke fungsi:
Kemudian sebuah thread kernel membahas daftar pekerjaan yang ditangguhkan dan ketika sampai ke node ini, ia secara efektif mengeksekusi:
Kemudian di bar Anda memiliki:
sumber
Itu berarti "tidak ada nilai". Anda menggunakan
void
untuk menunjukkan bahwa suatu fungsi tidak mengembalikan nilai atau tidak memiliki parameter atau keduanya. Cukup konsisten dengan penggunaan kata void dalam bahasa Inggris.sumber
Ini menunjukkan tidak adanya nilai kembali dalam suatu fungsi.
Beberapa bahasa memiliki dua jenis subrutin: prosedur dan fungsi. Prosedur hanyalah urutan operasi, sedangkan fungsi adalah urutan operasi yang mengembalikan hasil.
Dalam C dan turunannya, perbedaan antara keduanya tidak eksplisit. Semuanya pada dasarnya adalah fungsi. yang
void
kata kunci menunjukkan bahwa itu bukan fungsi "yang sebenarnya", karena tidak mengembalikan nilai.sumber
Pikirkan kekosongan sebagai "struktur kosong". Biarkan saya jelaskan.
Setiap fungsi mengambil urutan parameter, di mana setiap parameter memiliki tipe. Bahkan, kita bisa mengemas parameter ke dalam struktur, dengan slot struktur yang sesuai dengan parameter. Ini membuat setiap fungsi memiliki tepat satu argumen. Demikian pula, fungsi menghasilkan hasil, yang memiliki tipe. Ini bisa berupa boolean, atau bisa jadi float, atau bisa juga struktur, yang berisi sekumpulan nilai-nilai yang diketik secara sewenang-wenang. Jika kita menginginkan languge yang memiliki beberapa nilai balik, mudah untuk bersikeras mereka dikemas ke dalam struktur. Bahkan, kita selalu bisa bersikeras bahwa fungsi mengembalikan struktur. Sekarang setiap fungsi mengambil tepat satu argumen, dan menghasilkan tepat satu nilai.
Sekarang, apa yang terjadi ketika saya membutuhkan fungsi yang menghasilkan nilai "tidak"? Nah, pertimbangkan apa yang saya dapatkan ketika saya membentuk sebuah struct dengan 3 slot: itu memegang 3 nilai. Ketika saya memiliki 2 slot, ia memiliki dua nilai. Ketika memiliki satu slot, satu nilai. Dan ketika memiliki nol slot, ia memegang ... eh, nilai nol, atau "tidak" nilai ".Jadi, saya bisa memikirkan fungsi mengembalikan batal sebagai mengembalikan sebuah struct yang tidak mengandung nilai. Anda bahkan dapat memutuskan bahwa" batal " hanyalah sinonim untuk tipe yang diwakili oleh struktur kosong, bukan kata kunci dalam bahasa (mungkin hanya tipe yang sudah ditentukan sebelumnya :)
Demikian pula, saya dapat memikirkan fungsi yang tidak membutuhkan nilai sebagai menerima struktur kosong, misalnya, "kosong".
Saya bahkan dapat mengimplementasikan bahasa pemrograman saya dengan cara ini. Melewati nilai void membutuhkan nol byte, jadi memberikan nilai void hanyalah kasus khusus untuk melewatkan nilai lain dengan ukuran arbitrer. Ini memudahkan kompiler untuk memperlakukan hasil atau argumen "void". Anda mungkin ingin fitur langauge yang dapat membuang hasil fungsi; di C, jika Anda memanggil fungsi hasil tidak-kosong foo dalam pernyataan berikut: foo (...); kompiler tahu bahwa foo menghasilkan suatu hasil dan mengabaikannya. Jika void adalah nilai, ini berfungsi dengan sempurna dan sekarang "prosedur" (yang hanya kata sifat untuk fungsi dengan hasil batal) hanyalah kasus khusus sepele dari fungsi umum.
Void * sedikit lebih lucu. Saya tidak berpikir perancang C memikirkan kekosongan dengan cara di atas; mereka baru saja membuat kata kunci. Kata kunci itu tersedia ketika seseorang membutuhkan titik ke tipe arbitrer, sehingga membatalkan * sebagai ungkapan dalam C. Itu benar-benar berfungsi dengan baik jika Anda mengartikan kekosongan sebagai struktur kosong. Void * pointer adalah alamat tempat di mana struktur kosong itu diletakkan.
Dipasang dari void * ke T * untuk tipe T lainnya, juga bekerja dengan perspektif ini. Cast pointer adalah cheat lengkap yang bekerja pada arsitektur paling umum untuk mengambil keuntungan dari fakta bahwa jika tipe T senyawa memiliki elemen dengan subtipe S ditempatkan secara fisik pada awal T dalam tata ruang penyimpanannya, kemudian casting S * ke T * dan sebaliknya menggunakan alamat mesin fisik yang sama cenderung berhasil, karena sebagian besar pointer mesin memiliki representasi tunggal. Mengganti tipe S dengan tipe void memberikan efek yang persis sama, dan karenanya casting ke / dari void * berhasil.
Bahasa pemrograman PARLANSE mengimplementasikan ide-ide di atas dengan sangat erat. Kami melakukan kesalahan dalam desainnya, dan tidak memperhatikan "void" sebagai tipe pengembalian dan karenanya memiliki kata kunci langauge untuk prosedur. Sebagian besar itu hanya perubahan sintaksis sederhana tetapi salah satu hal yang tidak bisa Anda lakukan setelah Anda mendapatkan kode besar yang berfungsi dalam suatu bahasa.
sumber
Di c # Anda akan menggunakan kata kunci kosong untuk menunjukkan bahwa metode tidak mengembalikan nilai:
sumber
Tiga kasus penggunaan untuk batal:
Tanda tangan fungsi.
void foo(int bar)
tidak mengembalikan nilai.int bar(void)
tidak mengambil parameter apapun tapi ini biasanya dinyatakan dengan daftar argumen kosong:int bar()
. Penggunaan kata kunci batal di sini sesuai dengan artinya dalam bahasa Inggris.Pointer tipe top generik
void *
yang menunjuk ke data yang tidak ditentukan dan tidak dapat disereferensi Di sini makna void berbeda dari makna void lainnya: tipe universal vs no type.Dalam gips seperti
(void) new Foo(this)
untuk menandakan bahwa nilai pengembalian sengaja dibuang. Di sini, penggunaan kata kunci juga cocok dengan artinya dalam bahasa Inggris.Kasus 1 dan 2 sudah dicakup oleh @Gerald tetapi kasus 3 belum ditangani.
sumber
Jika Anda menjelaskan konsepnya kepada seorang pemula, mungkin akan bermanfaat untuk menggunakan analogi. Penggunaan void dalam semua kasus ini analog artinya dengan sebuah halaman dalam buku yang memiliki kata-kata berikut, "Halaman ini sengaja dikosongkan." Ini adalah untuk membedakan ke kompiler antara sesuatu yang harus ditandai sebagai kesalahan, versus jenis yang sengaja dikosongkan karena itu adalah perilaku yang Anda inginkan.
Itu selalu muncul dalam kode di mana biasanya Anda akan mengharapkan untuk melihat jenis muncul, seperti jenis kembali atau jenis penunjuk. Inilah sebabnya mengapa dalam C #, batal memetakan ke tipe CLR yang sebenarnya, System.Void karena itu adalah tipe itu sendiri.
Beberapa bahasa pemrograman tidak pernah mengembangkan konsep void, seperti halnya beberapa budaya manusia tidak pernah menemukan konsep angka nol. Void mewakili kemajuan yang sama dalam bahasa pemrograman seperti konsep nol mewakili bahasa manusia.
sumber
Itu berarti "tidak ada nilai". Anda menggunakan void untuk menunjukkan bahwa suatu fungsi tidak mengembalikan nilai atau bahwa ia tidak memiliki parameter atau keduanya. Ini lebih konsisten dengan penggunaan khas kata void dalam bahasa Inggris.
Void tidak boleh dikacaukan dengan null. Null berarti untuk variabel yang alamatnya ada di stack, nilai di heap untuk alamat itu kosong.
sumber
Void hanya digunakan dalam tanda tangan metode. Untuk jenis pengembalian itu berarti metode tidak akan mengembalikan apa pun ke kode panggilan. Untuk parameter artinya, tidak ada parameter yang diteruskan ke metode
misalnya
Dalam C # kita bisa menghilangkan void untuk parameter dan dapat menulis kode di atas sebagai:
Void tidak boleh dikacaukan dengan null. Null berarti untuk variabel yang alamatnya ada di stack, nilai di heap untuk alamat itu kosong.
sumber
Void adalah tipe tidak lengkap yang, menurut definisi, tidak bisa menjadi nilai. Itu berarti tidak bisa mendapatkan nilai.
Jadi itu juga tidak bisa menyimpan nilai apa pun.
sumber
batal artinya Anda tidak akan mengembalikan nilai apa pun dari fungsi atau metode
sumber
Void berarti tidak ada nilai yang diperlukan dalam tipe pengembalian dari fungsi dalam ketiga bahasa.
sumber
Void adalah setara dengan Sub Visual Basic.
sumber