2014-02-12 2 views
1

У меня есть этот цикл while, который всегда заканчивается, если один из случаев является истинным, а не только завершением, если оба являются истинными. Кто-нибудь знает, почему?В то время как цикл с && заканчивается, если либо истинно, а если оба являются истинными

while (f != NULL && t!= NULL) 
{ 
    if (f == NULL && t!= NULL) 
    { 
     cout << t->start_byte << " - "<< left<< setw(20) << t-> end_byte << t->id << endl; 
     t=t->next; 
    } 
    else if (t == NULL && f != NULL) 
    { 
     cout << f->start_byte << " - "<< left<< setw(21) << f-> end_byte << "FREE" << endl; 
     f=f->next; 
    } 
    else 
    { 
     cout << f->start_byte << " - "<< left<< setw(21) << f-> end_byte << "FREE" << endl; 
     cout << t->start_byte << " - "<< left<< setw(21) << t-> end_byte << t->id << endl; 
     cout<< " IM IN THE BOTH " << endl; 
     t=t->next; 
     f=f->next; 
    } 
} 

Выход следующим образом, иметь в виду, что в этом конкретном примере цикл должен иметь более одного свободного выхода на дне, потому что мой е связный список имеет 3 узлов, а мой т связанный список имеет 2

Memory Block Job 

0 - 99     FREE 
100 - 129     3 
IM IN THE BOTH 
130 - 149     FREE 
150 - 179     2 
IM IN THE BOTH 
+0

_ "вместо того, чтобы заканчиваться, если оба являются истинными" _ Вы имеете в виду _if, либо условие является false_? – Michael

ответ

7
while (f != NULL && t!= NULL) 

будет оценивать справедливо только если оба f и t не являются NULL.

Судя по коду внутри цикла, вы хотите, чтобы он выполнялся, в то время как любая переменная не была NULL. Вы должны использовать логическое ИЛИ || вместо:

while (f != NULL || t!= NULL) 
+0

Такая глупая ошибка с моей стороны, большое спасибо! Я не уверен, почему я так не думал об этом. Я думал, что это произойдет, и даже не подумал попробовать другой вариант. – Shane1022

3

Если у вас есть boolean1 && boolean2, вот возможные сценарии:

boolean1 | boolean2 | result 
---------+----------------+------- 
    true |  true  | true 
    true |  false  | false 
    false | doesn't matter | false 

Когда boolean1 является false, из-за short circuit evaluation, boolean2 не будет даже достигнут, так как результат false в любом случае. Таким образом, в этом случае условие цикла будет выполнено только , если две стороны: true.

Вы можете использовать || вместо &&:

while(f != NULL || t!= NULL) 

А теперь условие будет выполнено, если только один из этих двух true.

+0

Случай 'true' /' false' не покрывается вашей таблицей. – fredoverflow

+0

@FredOverflow Правильно. Я добавлю это :) – Maroun

2

Петля работает до тех пор, пока оба условия истинны и заканчиваются, как только один из них является ложным.

Если вы хотите, чтобы его запустить, пока один из них, правда, и закончится, как только оба они являются ложными, то:

Измените && в ||.

Смежные вопросы