if((A) && (B))
{
//do something
}
else
//do something else
Pytanie brzmi, czy stwierdzenie natychmiast przerwałoby się na inne, gdyby A było FALSE. Czy B zostanie oceniony?W jaki sposób ocenia się wyrażenie "if (A && B)"?
Pytam o to w przypadku, gdy B sprawdza poprawność indeksu tablicy, powiedz tablica [0], gdy tablica jest rzeczywiście pusta i ma zero elementów. Dlatego rzucanie segfaultem, ponieważ próbujemy uzyskać dostęp do czegoś, co jest poza granicami tablicy. Konkretnie
if((array.GetElements() > 0) && (array[0]))
array[0]->doSomething();
else
//do nothing and return
Może to być niebezpieczne, jeśli tablica [0] faktycznie zostanie oceniona, ponieważ zwraca błąd bez pierwszego wyboru po lewej stronie programu „& &”. Pierwszeństwo mówi mi, że lewa strona na pewno będzie miała pierwszeństwo, ale nie mówi mi, że nie oceni ona prawej strony, jeśli lewe jest FALSE.
Inną formą kanoniczną jest 'if (p && p-> bar) {}'. Jest to również bezpieczne. – MSalters
Jeśli po prostu chcesz "nic nie robić i wrócić", powinieneś całkowicie pominąć "inny". W przeciwnym razie kompilator będzie albo narzekał, że nie ma instrukcji, aby przejść do innej (jeśli jest ostatnią rzeczą w zamykającym bloku), albo, co gorsza, bierze następną instrukcję i używa jej jako instrukcji do wstawienia bloku else . –
Próbowałem użyć komentarzy jako symbolu zastępczego, co oznacza: niektóre kody zostaną tu przeniesione, ale nie jest to wystarczająco ważne, aby uwzględnić je w moim przykładzie. Rzeczywistość polega na tym, że istnieje kod, który zwraca się w zakresie innego, ale także kod po zasięgu innego. Mam nadzieję, że to wyczyści – BuckFilledPlatypus