C neden işaretçiler için yıldız işaretini kullanır?
Basitçe - çünkü B yaptı.
Bellek doğrusal bir dizi olduğundan, hücredeki değeri bu dizideki bir dizin olarak yorumlamak mümkündür ve BCPL bu amaçla bir işleç sağlar. Asıl dilde yazılmıştı rv
ve daha sonra !
, B unary'yi kullanıyordu *
. Bu nedenle, p
başka bir hücrenin indeksini (veya adresini) veya işaretçiyi) içeren bir hücre ise, *p
bir ifadedeki bir değer veya bir ödevin hedefi olarak işaret edilen hücrenin içeriğine karşılık gelir.
Gönderen C Dili Geliştirme
Bu kadar. Bu noktada, soru, "python 3 neden .
bir yöntem çağırmak için kullanıyor ? Neden olmasın ->
?" Şey ... çünkü Python 2 .
bir yöntemi çağırmak için kullanıyor .
Nadiren bir dil hiçbir şeyden yoktur. Etkisi var ve daha önce gelen bir şeye dayanıyor.
Öyleyse, B neden !
kendinden önceki BCPL gibi bir işaretçiyi serbest bırakmak için kullanılmadı ?
Eh, BCPL biraz endişeliydi. Yerine &&
veya ||
kullanılan BCPL logand
ve logor
. Bunun nedeni çoğu klavyenin bulunmaması ∧
ya da ∨
tuşları olmaması ve eşit olmaması aslında kelimedi NEQV
(bkz. The BCPL Referans Kılavuzu ).
B, programcıların oldukça sık yaptığı tüm bu mantıksal operatörler için uzun kelimeler kullanmak yerine, sözdizimini sıkılaştırmak için kısmen ilham almış gibi görünüyor. Ve böylece !
dereference için oldu *
böylece !
mantıksal olumsuzlama için kullanılabilir. Unary *
operatörü ile binary *
operatörü (çarpma) arasında bir fark olduğuna dikkat edin .
Peki ya diğer seçenekler ->
?
->
Alan derefrences etrafında sözdizimsel şeker için alındı struct_pointer->field
olduğu(*struct_pointer).field
Diğer seçenekler gibi <-
belirsiz ayrıntılar oluşturabilir. Örneğin:
foo <- bar
Okunması gereken mi:
(foo) <- (bar)
veya
(foo) < (-bar)
İkili bir operatörden ve başka bir tekli operatörden oluşan bir tekli operatör yapmak, ikinci tekli operatör başka bir ifadenin ön eki olabileceğinden sorun yaşama olasılığı oldukça yüksektir.
Ayrıca, sık sık yazılan şeyleri minimumda tutmaya çalışmak yine önemlidir. Ben ediyorum nefret yazma zorunda:
int main(int argc, char->-> argv, char->-> envp)
Bu da okumak zorlaşıyor.
Diğer karakterler mümkün olabilirdi ( Amaç C ona uygun@
olana kadar kullanılmadı ). Yine de, bu, 'C kullanır' çünkü C kullanır . B neden kullanmadı ? B, tüm karakterleri kullanmadı. Program yok ( cpp karşılaştır ) ve B'de ( sonradan cpp tarafından kullanıldığı gibi) diğer karakterler mevcuttu .*
@
bpp
#
Eğer neden olarak bir tahminde bulunabiliyorsam - bunun nedeni tuşların nerede olduğudur. B'deki bir el kitabından :
Uygun göründüğü zaman adreslerin manipülasyonunu kolaylaştırmak için, B iki tane tek adresli adres operatörü *
ve &
. &
adres operatörü , varsayalım &x
ki adresi de x
öyledir. *
dolaylı operatördür; *x
"x'in içeriğini adres olarak kullan" anlamına gelir.
Bu &
shift-7 ve *
shift-8 olduğunu unutmayın. Birbirlerine yakınlıkları, programcının ne yaptıklarına dair bir ipucu olabilirdi ... ama bu sadece bir tahmin. Bir ederim Ken Thompson sormak zorunda olduğu seçim neden yapıldığıyla ilgili.
Yani, işte orada. C bu şekilde çünkü B idi. B bu şekilde çünkü BCPL'nin şeklinden değiştirmek istedi.
->
dereference operatörü olarak C dilinde kullanılıyor - bir yapı alanları erişirken:struct_pointer->field
, kısaltmasıdır(*struct_pointer).field
.