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++?