Kolejność warunków IF

2015-01-14 22:05
Bilski
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++?

Pozostało 580 znaków

2015-01-14 22:08
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)

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
Dla kompletności: logiczny operator && jest leniwy, bitowy operator & zawsze oblicza oba argumenty. - msm 2015-01-14 22:22

Pozostało 580 znaków

2015-01-14 23:41
Pijany Orzeł
0
_13th_Dragon napisał(a):

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

A co to znaczy?

Pozostało 580 znaków

2015-01-14 23:54
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.

ale mozna sie tez dziwic czemu sie nam funkcja nei wywoluje: if( warunek_zwracajacy_false && wartosc = foo (var2)) - WhiteLightning 2015-01-15 13:11

Pozostało 580 znaków

Liczba odpowiedzi na stronę

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