问题来自c,数据结构和算法分析一书。在谈论哈希表时,作者显示了这样的发现函数:
Positon find(ElementType Key,HashTable H)
{
Position CurrentPos;
int CollisionNum;
CollisionNum=0;
CurrenPos=Hash(Key,T->TableSize)
while(H->TheCells[CurrentPos].info!=Empty&&H->TheCells[CurrentPos].Element!=key)
{
CurrentPos+=2*++CollisionNum-1;
if(CurrentPos>=H->TableSize)
CurrentPos-=H->TableSize;
}
return CurrentPos;
}
作者说while
句中的判断条件的顺序,
H->TheCells[CurrentPos].info!=Empty && H->TheCells[CurrentPos].Element!=key
非常重要,不应该交换。但我不知道为什么。我试图交换订单,但功能仍然正常。如果我更换订单会发生什么错误?
答案 0 :(得分:1)
如果没有进一步的细节,我的猜测是如果H->TheCells[CurrentPos].info
是Empty
,那么H->TheCells[CurrentPos].Element
没有意义(可能没有初始化?),因此评估它会导致错误。
这是这种模式的一个(有点愚蠢/极端)的例子:
char *dst = NULL;
if (dst != NULL && memcpy(dst, "foo", strlen("foo" +1))) // this is OK
// do stuff
memcpy(dst, "foo", strlen("foo" +1)); // segfault here!!!
这是一些(不那么愚蠢)伪代码来获得这个想法:
if (something.has_a_value == true && something.value == value_I_look_for)
// then proceed
答案 1 :(得分:1)
假设您编写了多个条件,例如condition1 && condition2 && ...
。这些是从左到右评估的。如果这些条件中的任何一个评估为假,则不会评估右侧的其余条件。
现在您还没有向我们提供有关您的代码中使用的结构的足够信息,但如果.info
假设某个单元格的Empty
包含.Element
似乎是合理的该单元格尚未初始化。
如果我们写
H->TheCells[CurrentPos].info!=Empty && H->TheCells[CurrentPos].Element!=key
然后我们首先检查.Element
是否已初始化。只有这样,我们才会继续将其值与key
进行比较。如果不是,则永远不会访问.Element
。
但如果我们写
H->TheCells[CurrentPos].Element!=key && H->TheCells[CurrentPos].info!=Empty
可能存在问题。假设当前单元格的.Element
尚未初始化。第一个条件访问.Element
以将其与key
进行比较。这可能会导致未定义的行为。