Я новичок в Java и мне нужна ваша помощь с домашним заданием. Вот задача:
class F {
private static int x = 0;
public static int funcB(int z){
return ++x + z;
}
public static int func(int x) {
x = x + 2;
x = funcB(x);
return x++;
}
}
class Main {
public static void main(String[] args) {
int z = 2;
int x = F.func(z);
System.out.println(z);
System.out.println(x);
x = F.func(x + z);
System.out.println(x);
}
}
Почему х = 5?
У вас есть 3 переменные разные с именами x, которые могут вас смутить. Начните с переименования их, чтобы лучше понять ваш код.
Кроме того, если вам все еще нужна помощь после этого, рассмотрите возможность указания другого значения, которое вы ожидали, и Зачем. Это может помочь нам увидеть ошибку в ваших предположениях, чтобы мы могли сосредоточиться на ней, не тратя время на объяснение частей, которые вы уже знаете.
x равно 5, когда печатается первый System.out.println(x), когда я запускаю ваш код через отладчик. Я сделал это на С#, но я предполагаю, что это будет то же самое. Установите точку останова для каждого метода и наблюдайте за значениями.
@Pshemo - поскольку это домашнее задание, я полагаю, что смысл в том, чтобы понять правила области видимости.




Причина, по которой x равно 5 в вашем основном методе, заключается в тонком x++.
Оператор return в сочетании с x++ — это трюк, потому что x++ означает, что сначала вы используете x в текущей инструкции, а затем увеличиваете его на единицу. Ваш код будет расширен до
Вернуть х;
Х = х + 1
Если сомневаетесь, напишите. Итак, мы начинаем с...
int z = 2;
int x = F.func(z);
который вызывает...
public static int func(int x) {
x = x + 2;
x = funcB(x);
return x++;
}
Итак, вход x — это 2.
x = x + 2 = 2 + 2 = 4, поэтому x теперь равен 4x = funcB(x)который вызывает...
public static int funcB(int z) {
return ++x + z;
}
z будет 4.++x + z, x есть 0++x является «префиксным» приращением, означающим, что приращение будет применено ДО того, как будет выполнена остальная часть оператора, что делает x = 1.1 + z = 1 + 4 = 5Вернуться к func
return x++; — это уловка (и распространенная область ошибок), x++ — это «постфиксное» дополнение, означающее, что x будет увеличиваться ПОСЛЕ выполнения оператора (ради аргумента), что означает, что метод вернет 5все так запутано :(
Добро пожаловать в лес, берегите деревья
Можете мне подробно объяснить, почему в последнем System.out.printLn(x) выходит? :/
F.x — это static, поэтому он сохраняет присвоенное ему значение при нескольких вызовах.
Для этого и нужна настольная проверка — если сомневаетесь, запишите.