1

我无法理解手册页中给出的这个例子dc

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

对我来说答案应该是 2,因为:

  1. 1 0:a
    这里我们将 1 存储在 array 的第 0 个位置a

  2. 0Sa
    现在我们将 0 压入 register 的堆栈a

  3. 2 0:a 现在我们再次将 2 存储在数组的第 0 个位置,a从而覆盖之前存储在该位置的 1。

  4. La
    现在我们弹出存储在寄存器堆栈中的 0a并将其推送到主堆栈。

  5. 0;a
    现在我们再次将 0 推入主堆栈,然后将其弹出以用作数组索引,并将存储在数组第 0 位置的 2 推a入主堆栈。

  6. p
    现在我们打印主堆栈的顶部,即 2。所以答案应该是 2。

我错过了什么?

编辑 :

$ dc -V
dc (GNU bc 1.06.95) 1.3.95
4

1 回答 1

4

手册页中示例之前给出的解释:

请注意,寄存器的每个堆叠实例都有与之关联的自己的数组。

换句话说,当您在同一个寄存器上使用数组命令和堆栈命令时,您将创建一个二维结构。数组命令对顶行中的条目进行操作,堆栈命令对整行进行操作。

l此外,使用and命令检索的堆栈条目的“标量”值与L数组完全分开,而不仅仅是第 0 个元素的别名。(我没有从手册页中得到,但在我的实验中似乎是正确的。)

以下是示例中的命令,其结果值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],这会将 a1放在主堆栈的顶部。)

于 2016-01-06T16:23:45.147 回答