Saya baru saja belajar tentang C.
Saya merasa aneh bahwa pencipta memilih asterisk ( *
) sebagai simbol untuk pointer daripada simbol yang benar-benar terlihat seperti pointer ( ->
).
Mempertimbangkan bagaimana membingungkan dereferencing dan fungsi pointer dapat, adakah alasan historis, atau bahkan praktis, untuk menggunakan tanda bintang?
->
sedang digunakan dalam bahasa C sebagai operator dereference - saat mengakses bidang dalam struct:,struct_pointer->field
yang merupakan kependekan dari(*struct_pointer).field
.structs
untuk dereferencing, yang terasa aneh bagi saya. Ini simbol penunjuk, bukan? Kenapa tidak (<-
) untuk dereferencing? Apakah saya benar-benar satu-satunya yang berpikir seperti ini?^
digunakan dan dapat dianggap sebagai panah yang diputar dan dibaca sebagai "arahkan ke", artinya sama->
tetapi lebih pendek.^integer
berarti "pointer to integer" untuk deklarasi tipe, danvar^
berarti "memorivar
menunjuk ke" untuk dereferencing. Posisi simbol lebih logis daripada C saat membaca dari kiri ke kanan, yang selalu menempatkan setelah tipe dan sebelum nama variabel. Pascal juga menggunakan@
untuk mengambil alamat, yang lebih baik daripada&
, karena@var
adalah "alamat di mana var berada"Jawaban:
Sederhananya - karena B melakukannya.
Dari Perkembangan Bahasa C
Itu dia. Pada titik ini, pertanyaannya sama tidak menariknya dengan "mengapa python 3 digunakan
.
untuk memanggil metode? Mengapa tidak->
?" Yah ... karena Python 2 digunakan.
untuk memanggil metode.Jarang bahasa ada dari ketiadaan. Itu memiliki pengaruh dan didasarkan pada sesuatu yang datang sebelumnya.
Jadi, mengapa B tidak digunakan
!
untuk derefrencing pointer seperti BCPL pendahulunya lakukan?Nah, BCPL agak bertele-tele. Alih-alih
&&
atau||
BCPL digunakanlogand
danlogor
. Ini karena sebagian besar keyboard tidak memiliki∧
atau∨
kunci dan tidak sama sebenarnya adalah kataNEQV
(lihat Manual Referensi BCPL ).B tampaknya sebagian terinspirasi untuk memperketat sintaks daripada memiliki kata-kata panjang untuk semua operator logis ini yang sering dilakukan oleh programmer. Dan dengan demikian
!
untuk dereferensi menjadi*
sehingga!
dapat digunakan untuk negasi logis. Perhatikan ada perbedaan antara*
operator unary dan*
operator biner (multiplikasi).Itu
->
diambil untuk gula sintaksis sekitar derefrences lapanganstruct_pointer->field
yang(*struct_pointer).field
Opsi lain seperti
<-
bisa membuat parsing yang ambigu. Sebagai contoh:Apakah itu dibaca sebagai:
atau
Membuat operator unary yang terdiri dari operator biner dan operator unary lain sangat mungkin mengalami masalah karena operator unary kedua mungkin merupakan awalan untuk ekspresi lain.
Lebih jauh lagi, penting untuk mencoba menjaga hal-hal yang diketik sesering mungkin. Aku benci harus menulis:
Ini juga menjadi sulit dibaca.
Karakter lain mungkin telah dimungkinkan (yang
@
tidak digunakan sampai Objective C menggunakannya ). Meskipun sekali lagi, ini pergi ke inti 'C menggunakan*
karena B melakukannya'. Kenapa B tidak digunakan@
? Yah, B tidak menggunakan semua karakter. Tidak adabpp
program (bandingkan cpp ) dan karakter lain tersedia dalam B (seperti#
yang kemudian digunakan oleh cpp).Jika saya dapat menebak mengapa - ini karena di mana kuncinya. Dari manual di B :
Perhatikan bahwa
&
shift-7 dan*
shift-8. Kedekatan mereka satu sama lain mungkin merupakan petunjuk bagi programmer tentang apa yang mereka lakukan ... tapi itu hanya dugaan. Orang harus bertanya kepada Ken Thompson tentang mengapa pilihan itu dibuat.Jadi, begitulah. C seperti itu karena B dulu. B seperti itu karena ingin berubah dari bagaimana BCPL itu.
sumber
@
akan ada kemungkinan lain.&
dan*
). B juga tidak menggunakan#
jadi ada beberapa suku cadang di sekitar itu ... ada juga$
.Saya ditanya oleh seorang siswa apakah
&
dan*
dipilih karena mereka bersebelahan di papan ketik (sesuatu yang belum pernah saya perhatikan sebelumnya). Banyak googling membawa saya ke dokumentasi B dan BCPL, dan utas ini. Namun, saya tidak dapat menemukan banyak sama sekali. Sepertinya ada banyak alasan untuk*
di B, tetapi saya tidak dapat menemukan apa pun untuk&
.Jadi mengikuti saran @ MichaelT, saya bertanya pada Ken Thompson:
sumber