2012-12-20 14 views
10

Czy akceptuje się następujący kod?Czy mogę polegać na ocenie zwarć w celu sprawdzenia granic wektorowych w C++?

if(vector.size() > 0 && vector[0] == 3) { 
} 

Czy jest szansa, że ​​ulegnie awarii, gdy wektor jest pusty? Nie zauważyłem, że to się dzieje, ale obawiam się, że wciąż jest to możliwe.

+7

W porządku. Jak powiedziałeś, w grę wchodzi ocena zwarcia. Alternatywnie możesz użyć '! Vector.empty()' dla pierwszej części. – chris

+1

Tak. Zwarcie jest dokładnie określone przez normę. –

+0

możliwy duplikat gwarancji [Czy ocena skrótu w C++ jest taka, jak w Javie?] (Http://stackoverflow.com/questions/2108467/is-short-circuit-evaluation-guaranteed-in-c-as-it- is-in-java) – DazzaL

Odpowiedz

11

Tak, to działa, ale byłoby bardziej idiomatycznie powiedzieć: !vector.empty() && vector[0] == 3: To zadziała dla wszystkich pojemników z maksymalną wydajnością, więc nigdy nie jest gorsze, czasem lepsze i zawsze bardziej czytelne.

14

Tak, można polegać na wbudowanym operatorze && w celu zwarcia. To część specyfikacji.

+0

Awans. Sidenote: Ten "dwuetapowy" z 'operator &&' jest jedną z cech języka, którego najbardziej nie lubię. Szczerze mówiąc, komisja powinna mieć * nigdy * nie pozwolić na przeładowanie && i || jeśli nie mogli * zagwarantować *, że ta sama semantyka zastosowana, niezależnie od tego, czy wywoływany jest wbudowany czy przeciążony operator. –

+0

Nik Bougalis, jeśli coś jest niejednoznaczne, nie rób tego. To samo dotyczy przeciążania operatora ++ w celu zmniejszenia. – Beached

Powiązane problemy