Исходя из моего опыта работы с современными языками программирования и сценариев, я полагаю, что большинство программистов обычно привыкли ссылаться на первый элемент массива 0 как индекс.
Есть ли существенные преимущества в использовании 1 ?
Я уверен, что слышал о большем количестве языков, кроме Zsh, которые ведут себя аналогично с массивами; это нормально для меня, так же как и удобно.
Однако, поскольку ранее выпущенные и широко используемые языки сценариев оболочки, такие как ksh и bash, все используют 0, почему кто-то решил изменить этот общий "стандарт"?
Мой немедленный ответ на мой вопрос будет «конечно, нет»;
затем, единственное объяснение, которое я могу придумать, относясь к этой несколько «исключительной функции» к оболочкам, это « они просто сделали это, чтобы показать немного больше своей крутой оболочки ».
Я не знаю много ни о Zsh, ни о его истории, и есть большая вероятность, что моя тривиальная теория об этом не имеет никакого смысла.
Есть ли объяснение этому? Или это просто из личного вкуса?
csh
, который также использовал индексацию массивов на основе одного.Ответы:
awk
,tcl
по крайней мере, и инструменты , как правило , используются из оболочки (cut -f1-3
,head -n 3
,sort -k1,3
,cal 1 2015
,comm -1
) начинаются с 1.sed
,ed
,vi
число их линии от 1 ...$@
начинается с 1. zsh соответствует его обработке$@
(как в Bourne) или$argv
(как в csh). Посмотрите, как это сбивает с толку,ksh
где, например${@:0:1}
, не дает вам первый позиционный параметр.$a[1]
. Это также означает, что количество элементов совпадает с последним индексом (в zsh, как и в большинстве других оболочек, кроме ksh, массивы не редки).a[1]
для первого элемента согласуется сa[-1]
последним.Так что IMO вопрос должен быть: что пришло в голову Дэвиду Корну, чтобы его массивы начинались с 0?
источник
$0
это не позиционные параметры. Это не часть$@
."$@"
есть"$1" "$2" ...
. Когда дело доходит до функций, во многих оболочках вы видите, что они"$@"
являются аргументами функции, в то время как$0
остается путь к сценарию (или оболочка argv [0], когда сценарий не запущен)Я думаю, что наиболее вероятный ответ на это обратный массив, встроенный из
zsh
Если у вас есть массив с 4 элементами, допустим,
myvar=(1 2 3 4)
и вы хотите получить доступ к 4-му элементу, это будет такprint $myvar[4]
, верно?Однако, если вы хотите создать цикл, который будет перечислять элементы внутри этого массива в обратном порядке, это просто вопрос использования отрицательных индексов:
Это должно быть объяснено, поскольку, начиная с нуля, вы не достигнете ни одного из этих элементов, поскольку его нет
-0
.Вторая причина этого, вероятно, заключается в том, что код C, связанный с переменными в zsh, использует
int
илиdouble int
для определения индексов массива, и, поскольку он использует дополнение Two для представления отрицательных чисел, нет способа представить-0
( подписанный ноль ), как вы можете сделать в float. точечные переменные.Если вы действительно привыкли к индексам, начинающимся с 0, я предлагаю вам использовать
KSH_ARRAYS
опцию, чтобы это исправить.И, взяв крюк комментария @cuonglm,
csh
функции, которые были реализованы,zsh
описаны здесь . Кажется, это не историческая причина, а способ обеспечить комфортную рабочую среду для тех, кто используется сcsh
источник
-
с~
.bash
. я думаю, что он обрабатывает отрицательные индексы для элементов набора как синтаксический сахар, но в противном случае не делает этого иначе. не могу вспомнить с моей точки зрения, люди должны просто создать каталог и использовать файлы для всего, что они вставляют во все это состояние оболочки. Вы можете индексировать эти элементы по своему усмотрению.~
это двоичная инверсия~0
есть-1
. (все биты перевернуты, полагается на то, как отрицательные числа обычно представляются побитовым образом). В неустановленном массиве или массиве, содержащем только один элемент с индексом 0, a [0], a [-0], a [-1] и a [~ 0] даст вам то же самое в массиве, подобном ksh.~
как-index
справлялся с этим, когда не работал. Наверное, все, что я сделал, было~-index
. Да. это звучит правильно. да! и, конечно, это работает и для неустановленных элементов. поэтому я думаю, что комментарий выше должен быть - для 0-индексированных массивов добавить~
. Я полагаю, это просто легче справиться с -1 частью. не знаю. это не прыгает на передний план моей памяти в данный момент ...