#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)