我正在阅读 C API LUA 文档,我注意到这段代码:
lua_pushnil(L); /* first key */
while (lua_next(L, t) != 0) {
/* uses 'key' (at index -2) and 'value' (at index -1) */
printf("%s - %s\n",
lua_typename(L, lua_type(L, -2)),
lua_typename(L, lua_type(L, -1)));
/* removes 'value'; keeps 'key' for next iteration */
lua_pop(L, 1);
}
除了使用 -2 和 -1 作为堆栈索引的行之外,它看起来很正常。
我尝试将它们改为正数,似乎对程序没有任何影响。他们为什么要专门使用底片?为什么这不会导致编译器错误?我确信您不能将无符号整数与负数一起使用。
我不知道它是否会做出任何改变,但我使用的是 C++ 而不是 C,所以也许这与它有关?
在Lua的C API中,堆栈索引允许为负整数,并且它们被解释为从堆栈顶部开始的索引。索引-1指的是栈顶,-2指的是从顶部算起的第二个元素,依此类推。此约定便于以 LIFO(后进先出)方式使用堆栈,这对于基于堆栈的编程来说是典型的。
在您提供的代码中:
printf("%s - %s\n",
lua_typename(L, lua_type(L, -2)),
lua_typename(L, lua_type(L, -1)));
这里,-2 指的是键,-1 指的是 Lua 堆栈上的值。负索引用于访问相对于堆栈顶部的元素,从而可以轻松使用 lua_next 返回的键值对。
将它们更改为正值时,您没有看到任何差异的原因是,Lua 允许您使用负索引从顶部访问堆栈,或使用正索引从底部访问堆栈。因此,如果 n 是正索引,则它指的是从堆栈底部开始索引为 n 的元素。
关于无符号整数的使用,Lua的API不使用无符号整数作为堆栈索引。堆栈索引的类型为int,可以是正数,也可以是负数。如果您使用的是 C++(这是一种比 C 更强类型的语言),您可能会看到有关转换有符号和无符号整数的警告,但这不会导致编译器错误。
综上所述,Lua C API 中使用负索引是从栈顶访问元素的约定,与无符号整数的使用无关。代码以这种方式设计是为了在使用 Lua 堆栈时保持简单性和一致性
根据文档:
为了方便起见,API 中的大多数查询操作不遵循严格的堆栈规则。相反,它们可以通过使用索引来引用堆栈中的任何元素:正索引表示绝对堆栈位置,从 1 开始作为堆栈底部; 负索引表示相对于栈顶的偏移量。更具体地说,如果栈有n个元素,那么索引1表示第一个元素(即最先压入栈的元素),索引n表示代表最后一个元素;索引-1也代表最后一个元素(即顶部的元素),索引-n代表第一个元素。