Похоже, не удается прервать цикл while при столкновении, хеширование

#c #loops #hash #g

#c #циклы #хэш #g

Вопрос:

Я не знаю, почему этот код не выходит из цикла while:

 int table_size = 953;
store hash_table[953];
for(int i = 0; i < table_size; i  )
    hash_table[i].count = 0;

//bunch of stuff to get hash value here

while(hash_table[hashNum].data != pString || hash_table[hashNum].count != 0){
    hashNum  ;
    if(hashNum > table_size)
        hashNum = 0;
    cout << hash_table[hashNum].count; 
    // to check the value of the count in the array, it IS 0, thus should have broken the loop
}
  

Ответ №1:

вы, вероятно, имеете в виду:

 while(hash_table[hashNum].data != pString amp;amp; hash_table[hashNum].count != 0)
  

В вашем коде цикл продолжится, если любой из вариантов имеет значение true, hash_table[hashNum].count == 0 этого недостаточно, чтобы сделать предложение false .

Комментарии:

1. @kingcong3: Акцент на amp;amp; . На данный момент в вашем коде говорится, что «если любая из этих вещей верна, продолжайте». Вместо этого с amp;amp; это означает «Если любая из этих вещей ложна, остановитесь».

Ответ №2:

hash_table[hashNum].count значения, равного нулю, недостаточно для завершения цикла, поскольку вы используете || или«) между двумя условиями в тесте завершения. Если hash_table[hashNum].data не равно pString , то цикл будет продолжаться независимо от того, что hash_table[hashNum].count есть.

Ответ №3:

Я думаю, что ваше условие цикла должно быть включено hashNum != 0 вместо hash_table[hashNum].count != 0 .

Во-вторых, в вашем состоянии while должно быть amp;amp; вместо || .

Это дикие предположения, поскольку в этом вопросе отсутствует много информации.

Ответ №4:

Вам следует взглянуть на двоичную логику, особенно на теорему Де Моргана

 !(a amp;amp; b) is equivalent to (!a) || (!b)