Инструкция возврата Java с приращением - каково общее поведение?

Я только что узнал, что если оператор return содержит операцию приращения, сначала выполняется return, а значение будет возвращено до его увеличения. Если я сначала увеличу значение в отдельном операторе, а затем вернусь, он будет работать как положено.

private static int incrementIntV1(int a)
{
   return a++;
}

private static int incrementIntV2(int a)
{
    a++;
    return a;
}

public static void main(String[] args)
{
    int b = 6;

    System.out.println("Increment in return: " + incrementIntV1(b));
    System.out.println("Increment first, then return: " + incrementIntV2(b));
    System.out.println("Increment with addZero: " + incrementAddZero(b));
}   

Что происходит с возвратом, что иногда делает оценку всего выражения, а иногда нет? Это что-то особенное в том, как происходит операция приращения?

Если я попробую:

private static int incrementAddZero(int a)
{
    return a++ + addZero();
}

private static int addZero()
{
    System.out.print("addZero executes");
    return 0;
}

Операция увеличения по-прежнему не выполняется, но я знаю, что метод addZero выполняется из-за оператора print. Почему он не увеличивается до возврата, но выполняет метод addZero до возврата?

Надеюсь, что его имеет смысл. Спасибо много.

2 ответа

Поведение, с которым вы столкнулись, не имеет ничего общего с оператором return. Это поведение оператора постинкремента. Выражение a++ приращений a но возвращает предыдущее значение a,

return a++;

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

int x = a++;
return x;

точно также,

return a++ + addZero();

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

int x = a++ + addZero();
return x;

или:

int x = a++;
return x + addZero();

a++ возвращает значение a прежде чем он был увеличен.

Что происходит с возвратом, что иногда делает оценку всего выражения, а иногда нет?

return всегда оценивает целое возвращаемое выражение (если только оператор return не содержит какой-либо закороченный оператор, такой как && а также ||, но это не так), но оценка оператора постинкрементного a++ возвращает старое значение a,

Из документа Java:

Единственное отличие состоит в том, что версия префикса (результат ++) оценивается в увеличенное значение, тогда как версия постфикса (результат ++) оценивается в исходное значение. Если вы просто выполняете простое увеличение / уменьшение, не имеет значения, какую версию вы выберете. Но если вы используете этот оператор в части большего выражения, то тот, который вы выберете, может существенно изменить ситуацию.

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