2016-01-05 8 views
1

Я не могу понять этот пример, приведенный в dc из страницы руководства:постоянного тока Unix: сохранение исходного значения даже после сохранения нового значения в том же индексе массива

$ dc 
1 0:a 0Sa 2 0:a La 0;ap 
1 

Для меня ответ должен быть 2, так как:

  1. 1 0:a
    Здесь мы храним 1 на 0-й позиции массива a.

  2. 0Sa
    Теперь мы помещаем 0 в стек регистр a.

  3. 2 0:a Теперь здесь мы храним 2 на 0-й позиции массива a таким образом перезапись предыдущий 1, хранящуюся в этом месте.

  4. La
    Теперь поп 0 хранится в стеке регистра a и вставьте его в основной стек.

  5. 0;a
    Теперь мы снова нажать 0 на основной стек, а затем вытолкнуть его использовать в качестве индекса массива и так нажать 2 хранятся в 0-ом месте из массива a в основной стек.

  6. p
    Теперь мы печатаем в верхней части основного стека, который 2. Таким образом, ответ должен быть 2.

Что мне не хватает?

Edit:

$ dc -V 
dc (GNU bc 1.06.95) 1.3.95 

ответ

4

Объяснение, данное перед примером на странице человека:

Обратите внимание, что каждый экземпляр укладываются в регистр имеет свой собственный массив, связанный с ним.

Другими словами, когда вы используете команды массива и команды стека в одном регистре, вы создаете двухмерную структуру. Команды массива работают с элементами в верхней строке, а команды стека работают со всеми строками.

Кроме того, «скалярное» значение записи в стеке, полученное командами l и L, полностью отделено от массива, а не просто псевдонимом для 0-го элемента. (Я не получил этого с man-страницы, но, похоже, это правда в моих экспериментах.)

Вот команды в примере с результирующими значениями a, расширенными в подробный формат. Самая внешняя структура - это стек, а верхний - первым.

Начальное значение всех регистров:

[ 
    { scalar: undefined, array: [] } 
] 

1 0:a

[ 
    { scalar: undefined, array: [1] } 
] 

0 Sa

[ 
    { scalar: 0, array: [] }, 
    { scalar: undefined, array: [1] } 
] 

2 0:a

[ 
    { scalar: 0, array: [2] }, 
    { scalar: undefined, array: [1] } 
] 

La

[ 
    { scalar: undefined, array: [1] } 
] 

(Первая запись имеет всплывающую. Его скалярное значение, 0, было отодвинуто на основной стек и его значение массива, [2], было сброшено.)

0;a

[ 
    { scalar: undefined, array: [1] } 
] 

(Команда ; не изменяет регистр, просто копирует запись 0-го массива в основной стек. Поскольку массив равен [1], это ставит 1 поверх основного стека.)