Kolejność warunków IF

0

Czy skompilowany program zawsze sprawdza warunki od lewej do prawej, czy kompilator sam decyduje?

Czy poniższy kod zawsze się wykona poprawnie, ewentualnie nie wejdzie do bloku, czy może się zdarzyć, że kompilator tak zoptymalizuje kod, że może wywołać się wyjątek?

Jeżeli kompilator zachowa zapisaną kolejność warunków, to pierwszy kod się wykona bez rzucania wyjątku, a w drugim może powstać wyjątek.

if ((dzielnik != 0) && ((dzielna / dzielnik) > 100))
{
}
if (((dzielna / dzielnik) > 100) && (dzielnik != 0))
{
}

Wydaje się, że najbardziej bezpieczny zapis jest taki:

if (dzielnik != 0)
{
    if ((dzielna / dzielnik) > 100)
    {
    }
}

Ale czy robienie dwóch IFów ma sens, czy można polegać na pierwszym zapisie, aby mieć pewność, że każdy kompilator C++ tak skompiluje program, że program nie rzuci wyjątku?

Przy okazji, czy w innych podobnych językach takich, jak Java, JavaScript, PHP, C# ta zasada jest też zachowana tak samo, jak w C++?

2
if ((dzielnik != 0) && ((dzielna / dzielnik) > 100))

to dokładnie to samo co: if (dzielnik != 0)
{
if ((dzielna / dzielnik) > 100)
{
}
}

Ponieważ porównanie w C++ jest "leniwe".

Tak a propos zastanów się nad: 
```cpp
if(dzielna>100*dzielnik)
0
_13th_Dragon napisał(a):

Ponieważ porównanie w C++ jest "leniwe".

A co to znaczy?

1
Pijany Orzeł napisał(a):
_13th_Dragon napisał(a):

Ponieważ porównanie w C++ jest "leniwe".

A co to znaczy?

Jeśli masz wyrażenie z logicznymi operatorami && lub ||, to w momencie gdy wynik wyrażenia już jest znany, to nie jest wyliczane dalej.

bool safe = true;
if (safe || jakies_inne_wyrazenie)

w tym przypadku jakies_inne_wyrazenie nie jest wyliczane, bo safe jest równe true, więc całe wyrażenie będzie true. Podobnie

bool safe = false;
if (safe && wyrazenie_ktore_nie_bedzie_wyliczane)

To oczywiście przyśpiesza działanie, bo nie trzeba wyliczać niepotrzebnych rzeczy, ale oprócz tego pozwala również pisać kod, który byłby niepoprawny bez tego:

JakasKlasa* wskaznik = stworz();     // zwraca wskaznik do JakasKlasa lub null jesli sie nie udalo
if (wskaznik && wskaznik->jakasMetoda())

W tym przypadku jeśli wskaznik jest nullem, to następna część nie jest wykonana, co jest pożądane bo wywołanie metody na nullu źle się skończy.

1 użytkowników online, w tym zalogowanych: 0, gości: 1