Разъяснение по коду относительно компиляторов Порядок оценки - PullRequest
2 голосов
/ 13 апреля 2020

Из информации, полученной в Интернете, я узнал, что порядок оценки оценивает левую сторону операнда перед правой. Однако, когда вы смотрите онлайн, это также похоже на короткое замыкание, так как оно также оценивает левое перед правым. Ниже мой код представляет собой короткое замыкание, однако хотел бы показать порядок оценки Кто-нибудь знает, что нужно изменить в приведенном ниже коде, чтобы показать код с точки зрения порядка оценки, в отличие от того, что в настоящее время отображается как короткое замыкание при работе в моем компиляторе. Компилятор использует Mini java.

class ImpFact{
    public static void main(String[] a){
    System.out.println(new Fac().ComputeFac(10));
    }
}

class Fac {

    public int ComputeFac(int num){
    boolean a;
    boolean b;
    int result;

    a = false;
    b = false;

    if (a || b) {
    result = 3;
    }
    else {
    result = 7;
}
    return result;
}

}

1 Ответ

1 голос
/ 13 апреля 2020

Я не уверен, что понимаю, что вы ожидаете в ответ на вопрос.

Но легко определить разницу между оценкой короткого замыкания и строгим порядком оценки.

Рассмотрим утверждение:

b = f(a) + g(a)

На языке, который гарантирует строгий порядок слева направо (например, Java), функция f будет вызываться перед функцией g , но * обе функции будут вызываться всегда.

С другой стороны, с выражением

b = f(a) || g(a)

f будет вызван первым, но вполне возможно, что g не будет называться. Оценка может остановиться после возврата f, если она возвращает истинное значение.

Существуют также языки, такие как C, которые не гарантируют оценку слева направо. На тех языках, когда оценивается f(a) + g(a), возможно, что g вызывается до f. Но оценка короткого замыкания (с логическими операторами) работает так же, потому что оценка короткого замыкания должна быть строго упорядочена.

...