Autor Wątek: warunek if - czy jest wszystko sprawdzane?  (Przeczytany 558 razy)

Offline zajmundov

  • Użytkownik

# Październik 02, 2017, 19:48:28
witajcie!
mam taką funkcję, która sprawdza czy na pozycji x,y znajduję się jakaś rzecz.

no i idzie to tak mniej więcej:

if( cośtam1 == false && cośtam2 == false && cośtam3 == false )
{
          return true;
}

czy w tym warunku If będzie sprawdzał wszystko nawet gdyby na samym początku było true?

bo zastanawiam się czy nie przebudować takiej funkcji i zrobić to tak:
if( cośtam1 == false )
return true;

if( cośtam2 == false )
return true;


(...)


moje spaghetti wygląda tak:
void Map::GenerateRandomObjectsOnMap( void )
{
for( std::vector<Tile*>::const_iterator cit = m_tiles.begin() ; cit != m_tiles.end() ; ++cit )
{
Tile* tile = ( *cit );
Player* player = Globals::player;

int random = std::rand() % 500 + 1;
std::cout << "GenerateRandomObjectsOnMap: " << random << std::endl;

if( !tile->IsProtectionZone() && !UseItemExistsAtPosition( tile->GetPosition().x, tile->GetPosition().y ) &&!StaticItemExistsAtPosition( tile->GetPosition().x, tile->GetPosition().y ) && !MonsterExistsAtPosition( tile->GetPosition().x, tile->GetPosition().y ) && !FoodGeneratorExistsAtPosition( tile->GetPosition().x, tile->GetPosition().y ) && player->GetPosition().x != tile->GetPosition().x && player->GetPosition().y != tile->GetPosition().y )
{
switch( random )
{
case 1:
m_monsters.push_back( Globals::factory->CreateMonster( "Wild Dog", Position( tile->GetPosition().x, tile->GetPosition().y ), 10, 10, 10, "monsterinfo" ) );
break;

case 2:
m_useItems.push_back( Globals::factory->CreateUseItem( tile->GetPosition(), HEALTH_KIT ) );
break;

case 3:
m_useItems.push_back( Globals::factory->CreateUseItem( tile->GetPosition(), FOOD ) );
break;

case 4:
m_useItems.push_back( Globals::factory->CreateUseItem( tile->GetPosition(), TOOL_BOX ) );
break;
}
}
}
}

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Karol

  • Użytkownik

# Październik 02, 2017, 22:12:44
if( cośtam1 == false && cośtam2 == false && cośtam3 == false )
{
          return true;
}

czy w tym warunku If będzie sprawdzał wszystko nawet gdyby na samym początku było true?

Nie będzie, ponieważ ten true rzutuje od razu na cały warunek, więc reszta zostanie pominięta. Zwie się to bodajże short boolean evaluation.
« Ostatnia zmiana: Październik 07, 2017, 01:13:07 wysłana przez Karol »

Offline Kurak

  • Użytkownik

# Październik 03, 2017, 02:32:34
https://en.wikipedia.org/wiki/Short-circuit_evaluation

Inna sprawa ze rozbijanie testow na pojedyncze ify moze byc przydatne przy debugowaniu, gdzie mozesz postawic breakpointa osobno na kazdym z nich jednym kliknieciem (jesli masz te warunki w jednym ifie to zeby zlapac tylko jeden z tych testow to nie da sie tego zrobic z poziomu kodu zrodlowego, przynajmniej w znanych mi debuggerach, tylko z widoku dissasembly). Wiec to kwestia wyczucia - jesli warunki sa ze soba tak powiazane ze praktycznie nie ma sensu ich kiedykolwiek testowac osobno to nie ma co ich rozbijac, jesli warunki sa ze soba niezbyt powiazane wtedy warto miec je osobno.
« Ostatnia zmiana: Październik 03, 2017, 02:36:31 wysłana przez Kurak »

Offline Xion

  • Redaktor
    • xion.log

# Październik 06, 2017, 21:44:04
Nie będzie, ponieważ ten true rzutuje od razu na cały warunek, więc reszta zostanie pominięta. Zwie się to bodajże short boolean evaluation.
Jeśli pierwszy warunek jest true to trzeba sprawdzić co najmniej drugi żeby ustalić wynik &&.

Offline Karol

  • Użytkownik

# Październik 07, 2017, 01:12:21
Jeśli pierwszy warunek jest true to trzeba sprawdzić co najmniej drugi żeby ustalić wynik &&.
True, pomyliłem and z orem :U