Я не могу продолжить задание

Я новичок в 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?

Для этого и нужна настольная проверка — если сомневаетесь, запишите.

MadProgrammer 08.02.2019 22:23

У вас есть 3 переменные разные с именами x, которые могут вас смутить. Начните с переименования их, чтобы лучше понять ваш код.

Pshemo 08.02.2019 22:28

Кроме того, если вам все еще нужна помощь после этого, рассмотрите возможность указания другого значения, которое вы ожидали, и Зачем. Это может помочь нам увидеть ошибку в ваших предположениях, чтобы мы могли сосредоточиться на ней, не тратя время на объяснение частей, которые вы уже знаете.

Pshemo 08.02.2019 22:36

x равно 5, когда печатается первый System.out.println(x), когда я запускаю ваш код через отладчик. Я сделал это на С#, но я предполагаю, что это будет то же самое. Установите точку останова для каждого метода и наблюдайте за значениями.

Rich 08.02.2019 23:25

@Pshemo - поскольку это домашнее задание, я полагаю, что смысл в том, чтобы понять правила области видимости.

user10762593 09.02.2019 02:58
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
5
43
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Причина, по которой 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 теперь равен 4
  • x = 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

все так запутано :(

Dario .b 08.02.2019 22:48

Добро пожаловать в лес, берегите деревья

MadProgrammer 08.02.2019 23:05

Можете мне подробно объяснить, почему в последнем System.out.printLn(x) выходит? :/

Dario .b 09.02.2019 10:48
F.x — это static, поэтому он сохраняет присвоенное ему значение при нескольких вызовах.
MadProgrammer 09.02.2019 21:57

Другие вопросы по теме