算术表达式中的数组引用

2025 年 6 月 3 日 | 阅读 5 分钟

众所周知,在编程语言中,数组用于在单个名称下存储多个值,并且可以使用其在数组中的位置或索引来访问每个值。 当我们谈论在算术表达式中使用数组引用时,我们只是指通过使用数组中的各个元素进行数学运算。

Array references in arithmetic expressions
  • 例如,如果我们有一个数字数组,例如测试分数或每日温度,个人可能希望将它们加起来然后求平均值或将一个元素与另一个元素进行比较。 为了实现这一点,个人将使用数组中的特定元素及其索引,然后以有效的方式对它们进行计算。

假设我们有一个名为 scores 的数组,其值为 [80, 85, 90]。 在这个数组中,我们也可以通过简单地写下类似 scores [0] + scores [1] 的内容来添加第一个和第二个分数。 但是,此表达式获取第一个值 (80) 和第二个值 (85),然后将它们加在一起。 我们还可以在更复杂的计算中使用所有这些引用,例如求三个分数的平均值: (scores [0] + scores[1] + scores[2]) / 3。

此外,这种直接从数组中插入值到我们的数学运算中的能力通常也使我们的代码更灵活、更强大。 尽管手动写出每个数字,但我们仍然可以使用循环或函数来处理整个数据集合,在运行时引用我们有效需要的值。

算术表达式中数组引用是什么意思?

如果元素存储在连续的块中,则可以快速访问数组的元素。 数组可以是一维或二维的。

对于一维数组

多维数组

行主或列主形式

  • 行主:a[1,1], a[1,2], a[1,3], a[2,1], a[2,2], a[2,3]
  • 列主:a[1,1], a[2,1], a[1, 2], a[2, 2],a[1, 3],a[2,3]
  • 在原始主要形式中,a[i1, i2] 的地址是
  • 基数+((i1-low1)*(high2-low2+1)+i2-low2)*宽度

数组元素的翻译方案

Limit(array, j) 返回 nj=highj-lowj+1

place:临时变量

offset:来自基数的偏移量,如果不是数组引用,则为 null

生产

数组元素的适当转换方案是

产生式规则语义动作
S → L := E{if L.offset = null then emit(L.place ':=' E.place)
 else EMIT (L.place'['L.offset ']' ':=' E.place);
}
E → E+E{E.place := newtemp;
 EMIT (E.place ':=' E1.place '+' E2.place);
}
E → (E){E.place := E1.place;}
E → L{if L.offset = null then E.place = L.place
  else {E.place = newtemp;
  EMIT (E.place ':=' L.place '[' L.offset ']');
   }
}
L → Elist ]{L.place = newtemp; L.offset = newtemp;
  EMIT (L.place ':=' c(Elist.array));
  EMIT (L.offset ':=' Elist.place '*' width(Elist.array);
}
L → id{L.place = lookup(id.name);
  L.offset = null;
}
Elist → Elist, E{t := newtemp;
  m := Elist1.ndim + 1;
  EMIT (t ':=' Elist1.place '*' limit(Elist1.array, m));
  EMIT (t, ':=' t '+' E.place);
  Elist.array = Elist1.array;
  Elist.place := t;
  Elist.ndim := m;
}
Elist → id[E{Elist.array := lookup(id.name);
  Elist.place := E.place
  Elist.ndim := 1;
}

其中

ndim 表示维数。

limit(array, i) 函数返回数组的维度以及上限

width(array) 返回数组的一个元素所需的字节数。

语法

当我们在编程中实际处理数组时,有一种简单的方法可以获取存储在其中的值。 数组中的每个值主要存储在特定位置,为了访问一个值,我们使用所谓的索引。 它的基本格式是数组的名称,后跟方括号内的索引号。

所以,它看起来像这样

数组名称[索引]

现在让我们分解一下。 数组名称 只是我们在实际创建数组时给数组起的名称。 索引 是一个数字,它告诉程序我们实际上要使用数组中的哪一个项目。 索引通常从 0 开始,因此第一个项目位于位置 0,第二个项目位于 1,依此类推。

  • 例如,如果我们有一个名为 grades 的数组,它包含一些考试分数,如 [75, 88, 92],在这种特殊情况下,我们实际上想使用第二个分数,那么我们将 grades 写入为 [1]。 这告诉程序获取位置 1 处的值,也就是 88。

#示例: 让我们想象一下,我们有一个名为 numbers 的数组中存储的数字列表。 它看起来像这样

numbers = [5, 10, 15, 20, 25]

现在,假设我们实际上想找出所有这些数字的总和。 除了逐个将它们相加之外,我们还可以使用循环遍历数组中的每个数字,并通过仅使用一个单独的变量来跟踪总数。

这里用通俗易懂的术语来说明

  • 我们将从一个名为 sum 的变量开始,并将其设置为 0。这将保存运行总数。
  • 然后,之后我们需要使用一个循环来遍历数组中的每个数字。
  • 并且对于每个数字,我们将它添加到总和中。
  • 循环结束后,sum 将保存数组中所有数字的总和。

在 Python 中,代码将如下所示

这里发生的事情非常简单:我从 0 遍历到数组的最后一个索引,并且每次,我们使用 numbers[i] 获取该位置的值并将其添加到 sum 中。 在循环结束时,我们已经将列表中的所有数字加起来了,sum 将包含最终结果。

常见问题解答/FAQ

关于在算术表达式中使用数组引用的一些常见问题如下:

问题 1:在编程中,“数组引用”是什么意思?

答案: 数组引用只意味着指向数组中的特定值。 我们可以使用数组的名称,后跟我们实际上想要的项目的在方括号中的位置。

问题 2:如何在数学计算中使用数组元素?

答案: 我们还可以通过仅使用索引引用它们,将数组元素直接包含在计算中。

  • 例如, 如果我们想将名为 scores 的数组的第一个值和第二个值相加,我们可以很容易地将其写为

total = scores[0] + scores[1]

问题 3:数组中的索引是什么?

答案: 索引是一个数字,它显示了数组中值的位置。 大多数编程语言从 0 开始计数,因此第一个项目位于索引 0,第二个项目位于索引 1,依此类推。