Итак, мой реальный вопрос: в чем разница между double x = 0;
и double x;
Первый из них объявляет x
и дает ему начальное значение.
Последний объявляет x
и не дает ему начальное значение.Вы можете дать x
значение позже, но вы должны сделать это для всех путей, которые ведут к любому использованию переменной.Например:
double x;
if (Math.pow(2, 2) >= 0.0) {
x = 0.0;
} else {
x = 1.0;
}
System.out.println(x); // OK
против
double x;
if (Math.pow(2, 2) >= 0.0) {
x = 0.0;
}
System.out.println(x); // ERROR
Последнее является ошибкой компиляции, поскольку существует возможный путь через код, где можно использовать x
до его инициализации.
Теперь любой, кто обладает знаниями по математике в старшей школе, может сказать вам, что квадрат целого числа всегда будет больше или равен нулю, и поэтому ветвь else
никогда не будет выбрана.Однако компилятор Java этого не знает и выдаст вам ошибку компиляции.(Действительно, не разрешено не давать вам ошибку компиляции. Я не буду вдаваться в подробности: они есть в JLS, если вам не безразлично.)
Почему первый работает в математических выражениях, но последний не может быть обнаружен компилятором?
Теперь это интересный вопрос.
Ответ в том, что =
имеет принципиально иное значение в языках программирования и математических уравнениях.
В языке программирования, таком как Java, a = b;
означает «присвоить (установить) текущее значение a
текущему значению b
».
В математическом уравнении a = b
означает «для всех мест, где используются эти a
и b
переменные, значение a
равно значению b
.».Это в основном ограничение на возможные значения a
и b
.
Еще один способ думать об этом состоит в том, что в математике переменная в уравнении представляет собой набор возможных значений.Уравнение ограничивает множество значений;например, a = sqrt(4)
равносильно тому, что a
обозначает {x | x * x == 4}
, что совпадает с множеством {-2, +2}
.
Теперь у математики есть случаи, когда запись ошибочна.Например, a = a + 1
эквивалентно тому, что a
обозначает {x | x == x + 1}
..., что является пустым набором.
(примечание, которое я использовал выше, не то, чтоклассические математики и формальные методы, которые обычно используют люди. К сожалению, это довольно сложно объяснить, если вы не взяли некоторые предметы / единицы математики университетского уровня. Или единицы формальных методов в курсе компьютерных наук.)
Наконец, вот такие общие вопросы и ответы, которые касаются других ваших ошибок компиляции и времени выполнения: