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

Например, у меня есть переменная, которая определяется как площадь круга радиуса radius.

double radius = 0.5d;
double pi = 3.1415926535d;
double area = Math.pow(radius,2)*pi;

Будет ли область определена как pi*radius^2 или как 0,78539816337? Другими словами, будет ли компьютер выполнять вычисления каждый раз или только один раз и повторно использовать это значение?

Если это письмо заставляет компьютер повторять вычисления, как я могу его улучшить? (Код будет выполнять миллиарды операций с использованием таких переменных)

0
Atom256-1 26 Ноя 2016 в 22:18

2 ответа

Лучший ответ

Он будет рассчитан только один раз. Допустим, вы хотите использовать area в следующей строке, поэтому ваш код выглядит так:

double radius = 0.5d;
double pi = 3.1415926535d;
double area = Math.pow(radius,2)*pi;
double x = area;

Теперь рассмотрим байт-код:

public static void main(java.lang.String[]);
   Code:
      0: ldc2_w         #2          // double 0.5d
      3: dstore_1
      4: ldc2_w         #4          // double 3.1415926535d
      7: dstore_3
      8: dload_1
      9: ldc2_w         #6          // double 2.0d
      12: invokestatic  #8         // Method java/lang/Math.pow:(DD)D
      15: dload_3
      16: dmul
      17: dstore        5
      19: dload         5
      21: dstore        7
      23: return

Значение area хранится в строке:

17: dstore        5

А когда вы хотите использовать переменную area, она просто загружается и не пересчитывается:

19: dload         5
0
Maroun 26 Ноя 2016 в 19:34

Выражение справа от знака = называется инициализатором , и оно выполняется при выполнении оператора объявления.

Это определено в Спецификации языка Java, §14.4.2 Выполнение объявлений локальных переменных:

Оператор объявления локальной переменной - это исполняемый оператор. Каждый раз, когда он выполняется, деклараторы обрабатываются слева направо. Если у декларатора есть инициализатор, инициализатор оценивается, и его значение присваивается переменной .

0
Andreas 26 Ноя 2016 в 19:42