Почему этот код Java компилируется?


Answers

int x = x = 1;

эквивалентно

int x = 1;
x = x; //warning here

пока в

int x = x + 1; 

сначала нам нужно вычислить x+1 но значение x неизвестно, поэтому вы получаете ошибку (компилятор знает, что значение x неизвестно)

Question

В области метода или класса строка ниже компилируется (с предупреждением):

int x = x = 1;

В области класса, где переменные получают свои значения по умолчанию , следующее дает ошибку «неопределенной ссылки»:

int x = x + 1;

Разве это не первый x = x = 1 должен закончиться той же ошибкой «неопределенной ссылки»? Или, может быть, вторая строка int x = x + 1 должна компилироваться? Или что-то мне не хватает?




Второй int x=x=1 компилируется, потому что вы присваиваете значение x, но в другом случае int x=x+1 здесь переменная x не инициализируется, помните, что в java локальная переменная не инициализируется значением по умолчанию. Примечание. Если это значение ( int x=x+1 ) в области видимости класса также затем также даст ошибку компиляции, так как переменная не будет создана.




Complier читает заявления справа налево, и мы решили сделать обратное. Вот почему это сначала раздражало. Сделайте это привычкой читать инструкции (код) справа налево, у вас не будет такой проблемы.




Во втором фрагменте кода x используется перед его объявлением, тогда как в первом фрагменте кода он просто назначается дважды, что не имеет смысла, но является допустимым.




x не инициализируется в x = x + 1 ;.

Язык программирования Java статически типизирован, а это значит, что перед тем, как они могут быть использованы, сначала должны быть объявлены все переменные.

См. Примитивные типы данных




В int x = x + 1; вы добавляете 1 в x, так что такое значение x , оно еще не создано.

Но в int x=x=1; будет компилироваться без ошибок, потому что вы назначаете 1 в x .




В java или на любом современном языке назначение происходит справа.

Предположим, что если у вас есть две переменные x и y,

int z = x = y = 5;

Этот оператор действителен, и именно так компилятор разбивает их.

y = 5;
x = y;
z = x; // which will be 5

Но в вашем случае

int x = x + 1;

Компилятор дал исключение, потому что он так разбивается.

x = 1; // oops, it isn't declared because assignment comes from the right.



Related