C(C) 在 BASIC 中有什么作用?

What does C(C) do in BASIC?

我目前正在尝试理解 this BASIC program。我对这部分特别有疑问:

DIM C(52),D(52)

FOR D=D TO 1 STEP -1
C=C-1
C(C)=D(D)
NEXT D

我猜这是一个 for 循环,从 D 开始,最后执行的迭代是 D=1(因此包括在内?)

C(C) 是做什么的? C 是一个有 52 个元素的数组,我假设 C(X) 是对数组 C 的第 X 个元素的访问。但是当参数是 C 本身时它会做什么?

在原始 BASIC 程序中,第 90 行有一个 GOTO 1500,位于第 16-19 行之前,您已在此处复制。第 1500 行是程序主循环的开始。这个特定的程序员使用(并不少见)模式将子例程放在他们的 BASIC 程序的开头,使用 GOTO 跳转到主代码。

您从链接的 Creative Computing 程序中复制的代码是“获取卡片”的子程序,如该代码部分上方的注释所示:

100 REM--SUBROUTINE TO GET A CARD.  RESULT IS PUT IN X.

REM 是基本语句;它代表“备注”。用现代的说法,就是评论。

在 BASIC 中,数组、字符串和数字位于不同的命名空间中。这意味着您可以(并且通常会)为数组使用与用于访问数组的整数相同的变量名。以下变量在 BASIC 中都是独立的,不会相互覆盖:

C = 12
C(5) = 33
C$ = "Jack of Spades"
C$(5) = "Five of Hearts"
  • 第 1 行是一个名为 C 的数值变量。
  • 第 2 行是一个名为 C 的数值数组。
  • 第 3 行是一个名为 C 的字符串。
  • 第 4 行是一个名为 C 的字符串数组。

一个程序可以包含所有这四个变量而不会发生冲突。这在现代编程语言中并不为人所知;例如,Perl 具有非常相似的行为。一个 Perl 脚本可以有一个数字、一个字符串、一个数组和一个散列,它们都具有相同的名称而不会冲突。

如果您查看所链接程序的第 1500 行并继续执行,您会看到变量 C 被初始化为 53。这意味着第一次调用该子例程时,C 开始在 53,并立即减少到 52,这是卡的数量。程序有运行位后,C的值会发生变化

基本上,这段代码将 array C 的一些值复制到 array D 中。它选择 D( ) 使用(最可能的整数)numeric 变量 C 和 D 复制到 C()。随着代码从 D 的初始值逐步下降到 1,C 也递减 1 .

如果 D 以值 3 开头,而 C 以值 10 开头,则会发生这种情况:

C(9) = D(3)
C(8) = D(2)
C(7) = D(1)

请注意,此示例纯属假设;我没有足够仔细地检查代码以验证这种值组合是否可以出现在程序中 运行.

一些注意事项。 BASIC 有许多 种变体,其中很少有绝对的。例如,一些 BASIC 方言将使用看起来像字符串数组的东西作为访问子字符串的方式,有时甚至会修改字符串中的子字符串。在这些方言中,C$(2) 将是字符串 C$ 中的第二个(或第三个,如果 zero-based)字符。您链接的 BASIC 程序似乎不是这些变体之一,因为它使用 LEFT$ 和 MID$ 来访问子字符串。

其次,许多 BASIC 方言都包含一个 DEFSTR 命令,该命令将变量定义为字符串变量,而无需使用“$”标记。如果以这种方式将变量定义为字符串,则它不再可用作数字。这通常适用于标量和数组形式。例如,考虑使用 TRS-80 Model III BASIC:

READY
>10 DEFSTR C
>20 C = "HELLO, WORLD"
>30 PRINT C
>40 C(3) = 5
>RUN
HELLO, WORLD
?TM Error IN 40
READY
>

程序成功接受一个字符串到变量C,并打印出来;它在尝试将数字分配给数组 C 的元素 3 时显示“类型不匹配错误”。这是因为 DEFSTR C 将 C 和 C() 都定义为字符串,并且尝试分配数字成为错误对他们中的任何一个。

您链接的程序可能(但不一定)支持 DEFSTR。但是,它没有使用它。

最后,很多变体都会有第三种类型的整型变量,不会和其他的有冲突;通常,此变量由“%”标识,与字符串由“$”标识的方式相同:

C = 3.5
C% = 4
C$ = "FOUR"

在这样的变体中,所有这三个变量都是独立的变量,并且彼此不冲突。您经常会在使用整数的代码顶部看到一个 DEFINT C,用于将该变量(和具有相同名称的数组)定义为整数,以节省内存并使程序 运行更快速。那个时代的 BASIC 通常执行整数计算比浮动 point/real 计算快得多。