Dari pengalaman saya dengan pemrograman modern dan bahasa scripting, saya percaya sebagian besar programmer umumnya terbiasa merujuk pada elemen pertama array dengan 0 sebagai indeks.
Apakah ada keuntungan substansial dalam menggunakan 1 ?
Saya yakin saya pernah mendengar lebih banyak bahasa selain Zsh yang berperilaku serupa dengan array; tidak masalah bagi saya, karena sama nyamannya.
Namun, seperti bahasa scripting shell yang sebelumnya dirilis dan banyak digunakan seperti ksh dan bash semua menggunakan 0, mengapa seseorang memilih untuk mengubah "standar" umum ini?
Jawaban langsung saya atas pertanyaan saya adalah "tentu saja tidak";
kemudian, satu-satunya penjelasan yang dapat saya pikirkan mengenai "fitur eksklusif" ini untuk kerang adalah " mereka hanya melakukan ini untuk memamerkan lebih banyak kerang keren mereka ".
Saya tidak tahu banyak tentang Zsh atau sejarahnya, dan ada kemungkinan besar teori sepele saya tentang ini tidak masuk akal.
Apakah ada penjelasan untuk ini? Atau hanya karena selera pribadi?
csh
, yang juga menggunakan pengindeksan array berbasis satu.Jawaban:
awk
,tcl
setidaknya, dan alat-alat yang biasanya digunakan dari shell (cut -f1-3
,head -n 3
,sort -k1,3
,cal 1 2015
,comm -1
) mulai dari 1.sed
,ed
,vi
jumlah baris mereka dari 1 ...$@
mulai dari 1. zsh konsisten dengan penanganannya$@
(seperti pada Bourne) atau$argv
(seperti pada csh). Lihat betapa membingungkannya diksh
mana${@:0:1}
tidak memberikan Anda parameter posisi pertama misalnya.$a[1]
. Ini juga berarti bahwa jumlah elemen sama dengan indice terakhir (dalam zsh seperti pada kebanyakan shell lain kecuali ksh, array tidak jarang).a[1]
untuk elemen pertama konsisten dengana[-1]
untuk yang terakhir.Jadi IMO pertanyaannya seharusnya: apa yang masuk ke kepala David Korn untuk membuat array mulai dari 0?
sumber
$0
bukan parameter posisi. Itu bukan bagian dari$@
."$@"
adalah"$1" "$2" ...
. Ketika datang ke fungsi, di banyak shell, Anda melihat bahwa"$@"
adalah argumen untuk fungsi, sementara$0
tetap jalan skrip (atau shell argv [0] ketika tidak menjalankan skrip)Saya pikir jawaban yang paling masuk akal untuk ini adalah built-in dari array terbalik
zsh
Jika Anda memiliki array dengan 4 elemen, katakanlah
myvar=(1 2 3 4)
dan Anda ingin mengakses elemen ke-4print $myvar[4]
, kan?Namun, jika Anda ingin membuat loop yang akan mencantumkan elemen-elemen di dalam array ini ke belakang, itu hanya masalah menggunakan indeks negatif:
Ini harus menjelaskan karena mulai dari nol, Anda tidak akan mencapai salah satu elemen tersebut karena tidak ada
-0
.Alasan kedua di balik ini mungkin adalah kode C terkait dengan variabel pada zsh menggunakan
int
ataudouble int
untuk menentukan indeks array, dan karena menggunakan Komplemen Dua untuk mewakili angka negatif tidak ada cara untuk mewakili-0
( Masuk nol ), seperti yang dapat Anda lakukan di float variabel titik.Jika Anda benar-benar terbiasa dengan indeks mulai dari 0, saya sarankan Anda untuk menggunakan
KSH_ARRAYS
opsi untuk memperbaikinya.Dan dengan mengaitkan komentar @cuonglm,
csh
fitur yang diimplementasikanzsh
dijelaskan di sini . Tampaknya bukan menjadi alasan historis tetapi cara untuk menyediakan lingkungan kerja yang nyaman bagi mereka yang terbiasa dengancsh
sumber
-
dengan~
.bash
. Saya pikir itu menangani indeks negatif untuk mengatur elemen sebagai gula sintaks, tetapi kemudian tidak melakukannya sebaliknya. tidak ingat. dari sudut pandang saya, orang hanya harus membuat direktori dan menggunakan file untuk apa pun yang mereka isikan ke semua negara shell Anda dapat mengindeks elemen-elemen itu dengan cara apa pun yang Anda suka.~
adalah inversi biner.~0
adalah-1
. (semua bit terbalik, bergantung pada bagaimana bilangan negatif biasanya direpresentasikan dengan bijaksana). Pada array yang tidak disetel atau array dengan hanya satu elemen indice 0, a [0], a [-0], a [-1] dan [~ 0] akan memberi Anda hal yang sama dalam array seperti ksh.~
ketika-index
tidak berfungsi. Saya kira mungkin yang saya lakukan adalah~-index
. ya. kedengarannya benar. iya nih! dan tentu saja itu berfungsi untuk elemen yang tidak disetel juga. jadi saya kira komentar di atas harus - untuk menambahkan array 0-diindeks~
. Saya kira itu hanya menangani -1 bagian mungkin lebih mudah. saya tidak tahu. itu tidak melompat ke garis depan ingatan saya saat ini ...