Z mojego doświadczenia z nowoczesnymi językami programowania i skryptów, uważam, że większość programistów jest przyzwyczajona do określania pierwszego elementu tablicy przez 0 jako indeksu.
Czy korzystanie z 1 ma jakieś istotne zalety ?
Jestem pewien, że słyszałem, że więcej języków innych niż Zsh zachowuje się podobnie do tablic; jest to dla mnie w porządku, ponieważ jest równie wygodne.
Jednakże, ponieważ wszystkie wcześniej wydane i szeroko używane języki skryptowe powłoki, takie jak ksh i bash, używają 0, dlaczego ktoś miałby zmienić ten wspólny „standard”?
Moja bezpośrednia odpowiedź na moje pytanie brzmiałaby „oczywiście nie”;
wtedy jedynym wyjaśnieniem, które mogę wymyślić w odniesieniu do tej „ekskluzywnej funkcji” dla powłok, byłoby „ po prostu zrobili to, aby pokazać nieco więcej swojej fajnej powłoki ”.
Nie znam jednak ani Zsh, ani jego historii i istnieje duża szansa, że moja trywialna teoria na ten temat nie ma żadnego sensu.
Czy jest na to wyjaśnienie? A może to po prostu z osobistego gustu?
csh
jednego, który również wykorzystywał indeksowanie tablic w oparciu o jedną jednostkę.Odpowiedzi:
awk
,tcl
co najmniej, i narzędzia zazwyczaj używane z powłoki (cut -f1-3
,head -n 3
,sort -k1,3
,cal 1 2015
,comm -1
) zaczynają się od 1.sed
,ed
,vi
liczba ich linie od 1 ...$@
zaczyna się od 1. zsh jest zgodny z obsługą$@
(jak w Bourne) lub$argv
(jak w csh). Zobacz, jak to jest mylące, wksh
którym${@:0:1}
nie daje pierwszy pozycyjny parametr dla instancji.$a[1]
. Oznacza to również, że liczba elementów jest taka sama jak ostatni indeks (w Zsh, podobnie jak w większości innych powłok z wyjątkiem ksh, tablice nie są rzadkie).a[1]
dla pierwszego elementu jest zgodny za[-1]
ostatnim.IMO powinno raczej postawić pytanie: co wpadło do głowy Davida Korna, aby jego tablice zaczynały się od zera?
źródło
$0
nie jest parametrami pozycyjnymi. To nie jest częścią$@
."$@"
jest"$1" "$2" ...
. Jeśli chodzi o funkcje, w wielu powłokach widać, że"$@"
są to argumenty funkcji, a jednocześnie$0
pozostaje ścieżka do skryptu (lub powłoki argv [0], gdy skrypt nie jest uruchomiony)Myślę, że najbardziej prawdopodobną odpowiedzią jest wbudowana odwrotna tablica
zsh
Jeśli masz tablicę z 4 elementami, powiedzmy
myvar=(1 2 3 4)
i chcesz uzyskać dostęp do czwartego elementuprint $myvar[4]
, prawda?Jeśli jednak chcesz utworzyć pętlę, która będzie wyświetlać listę elementów wewnątrz tej tablicy wstecz, wystarczy użyć ujemnych indeksów:
To powinno wyjaśnić, ponieważ zaczynając od zera, nie osiągniesz jednego z tych elementów, ponieważ nie ma go
-0
.Drugim powodem tego jest prawdopodobnie kod C związany ze zmiennymi na zsh używa
int
lubdouble int
definiuje indeksy tablic, a ponieważ używa dopełnienia Two do reprezentowania liczb ujemnych, nie ma możliwości reprezentacji-0
( zero z podpisem ), tak jak można to zrobić na liczbach zmiennoprzecinkowych zmienne punktowe.Jeśli naprawdę jesteś przyzwyczajony do indeksów zaczynających się od 0, sugeruję skorzystanie z
KSH_ARRAYS
opcji, aby to naprawić.I biorąc pod uwagę komentarz @cuonglm,
csh
funkcje zaimplementowanezsh
zostały wyjaśnione tutaj . Wydaje się, że nie jest to powód historyczny, ale sposób na zapewnienie komfortowego środowiska pracy dla tych, którzy są przyzwyczajenicsh
źródło
-
z~
.bash
. myślę, że obsługuje ujemne wskaźniki dla ustawionych elementów jako cukier składniowy, ale wtedy nie robi tego inaczej. nie pamiętam. z mojego punktu widzenia ludzie powinni po prostu utworzyć katalog i używać plików do wszystkiego, do czego są wpychani w ten stan powłoki. możesz indeksować te elementy w dowolny sposób.~
jest inwersją binarną.~0
jest-1
. (wszystkie bity odwrócone, zależą od tego, w jaki sposób liczby ujemne są zwykle reprezentowane bitowo). W nieuzbrojonej tablicy lub tablicy z tylko jednym elementem indeksu 0, [0], [-0], [-1] i [~ 0] da ci to samo w tablicy podobnej do ksh.~
kiedy-index
nie działało. Chyba chyba wszystko, co zrobiłem~-index
. Tak. to brzmi dobrze. tak! i oczywiście działa to również w przypadku rozbrojonych elementów. więc przypuszczam, że powyższy komentarz powinien być - dla tablic 0-indeksowanych dodaj~
. Chyba po prostu poradził sobie z częścią -1. nie wiem. w tej chwili nie przeskakuje mi na pierwszy plan ...