Как именно работает приоритет оператора Java? - PullRequest
0 голосов
/ 01 мая 2019

Я хочу спросить кое-что простое.

Я приведу очень простой пример расчета, в котором я получаю результат, отличный от моих ожиданий.Может ли кто-нибудь объяснить, какой шаг я сделал неправильно?

public static void main(String[] args) {
       int x  =1;
       int y = 101;
       int a = 2;


       int z =  ++y + y * a << 3 *2 * ++x + (x+=2);
       /*
       Step 1 int z =  ++y + y * a << 3 *2 * ++x + (3);
       Step 2 int z =  102 + 102 * 2 << 3 *2 * 4 + (3);
       Step 3 int z =  102 + 204 << 24 + (3);
       Step 4 int z =  306 << 27;
       Expected:41,070,624,768‬
        */

       System.out.println(z);
       //Actual: 20,054,016
   }

1 Ответ

1 голос
/ 01 мая 2019

Операторы битового сдвига имеют более низкий приоритет, чем аддитивные операторы, которые имеют более низкий приоритет, чем мультипликативные операторы, которые имеют более низкий приоритет, чем операторы увеличения / уменьшения.Также обратите внимание, что переменные оцениваются слева направо независимо от приоритета операторов между ними.

int z =  ++y + y * a << 3 *2 * ++x + (x+=2);

Сначала делайте приращения.

102 + 102 * 2 << 3 * 2 * 2 + 4

Затем делайте умножение.

102 + 204 << 12 + 4

Затем выполните сложение.

306 << 16

Битовый сдвиг приводит к 20054016.

Похоже, вы ошиблись при оценке выражений с x вони в крайнем правом.

...