【问题标题】:dc unix : preserving initial value even after storing new value at the same array indexdc unix:即使在同一数组索引处存储新值后也保留初始值
【发布时间】:2016-04-09 23:09:15
【问题描述】:

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

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

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

  1. 1 0:a
    这里我们将 1 存储在数组 a 的第 0 位。

  2. 0Sa
    现在我们将 0 压入寄存器a 的堆栈。

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

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

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

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

我错过了什么?

编辑:

$ dc -V
dc (GNU bc 1.06.95) 1.3.95

【问题讨论】:

    标签: arrays unix stack dc


    【解决方案1】:

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

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

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

    此外,使用lL 命令检索的堆栈条目的“标量”值与数组完全分开,而不仅仅是第 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],这会将1 放在主堆栈顶部。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-23
      • 2015-09-16
      • 1970-01-01
      • 2016-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-26
      相关资源
      最近更新 更多