【发布时间】:2021-11-25 11:36:51
【问题描述】:
根据定义,在每个 C 标准中,x[y] 等价于(并且经常编译为)*((x)+(y))。此外,数组的名称被转换为它的地址运算符——所以如果 x 是一个数组,它将是 *((&(x))+(y))
因此,对于多维数组,x 作为二维数组,x[y][z] 将等价于 (((&(x))+(y))+( z))
在我正在研究的小型玩具 C 编译器中,这无法生成正确的代码,因为它试图在每个 * 指令处间接访问指向的地址——这适用于单维数组,但适用于多维它会导致类似(在模糊的汇编伪代码中)
load &x; add y; deref; add z; deref
其中 deref 是在前一个计算的地址加载值的指令——因为这就是间接运算符的工作方式??
但是,这会产生错误的代码,因为我们应该处理一个地址,只在最后解除引用。我假设我缺少规范中的某些内容?
【问题讨论】:
-
"数组名转换为地址操作符" 不可以。你可以说
x被转换为&x[0],比较的类型不同到&x。 -
数组在用作 L 值时不会转换为指针,仅用作 R 值。
-
deref的作用取决于类型,您必须检测到这一点。一般来说,是的,deref() { if simple pointer; then deref; if array; then only remove one dimension from type and don't change the value, if pointer to function, then do nothing } -
Aa还有
&*是空操作的情况,所以你必须检查下一个操作是否是&然后什么都不做,例如。
标签: arrays c multidimensional-array compiler-construction code-generation