c - 循环中守卫的数组索引?它实际上在检查什么?
问题描述
这些是用于使用开放寻址实现哈希映射的 C 代码部分。我不明白 insert 函数中的 while 循环正在检查什么,而 twoSum 函数中的 if 语句正在检查什么。
while 循环条件是否检查值是否在数组中或值是否不为空。if 语句是否检查值是否不为 0?我不明白。
我一直认为这样的事情会像需要手动中断的 while(1) 循环一样工作。
我想知道循环保护语句的条件是什么,我了解正文。
void insert(int *keys, int *values, int key, int value) {
int index = hash(key);
while (values[index]) { // What does this check for?
index = (index + 1) % SIZE;
}
keys[index] = key;
values[index] = value;
}
int* twoSum(int* nums, int numsSize, int target) {
int keys[SIZE];
int values[SIZE] = {0};
for (int i = 0; i < numsSize; i++) {
int complements = target - nums[i];
int value = search(keys, values, complements);
if (value) { // What does this line check for?
int *indices = (int *) malloc(sizeof(int) * 2);
indices[0] = value - 1;
indices[1] = i;
return indices;
}
insert(keys, values, nums[i], i + 1);
}
return NULL;
}
解决方案
我们只能猜测。
看起来 期望指向始终具有值为零的最终元素的数组的指针,insert
函数的设计者选择了该约定来表示“数组的结尾”。
当搜索失败时,它看起来返回零。 search
然而,任何一个都可能是一个错误(我很怀疑,因为这种设计禁止将零视为“真实”/有效值),并且两者都可以说是糟糕的设计 - 在前一种情况下,为什么不将数组大小传递为一个论点?在后一种情况下,为什么不返回bool
并给出结果(如果成功)作为“输出参数”,就像其他 C API 一样?
最终,我们无法神奇地知道函数的先决条件,因此您必须询问编写它的人。
这就是为什么代码应该有解释性注释。