Инструкция возврата 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:
Единственное отличие состоит в том, что версия префикса (результат ++) оценивается в увеличенное значение, тогда как версия постфикса (результат ++) оценивается в исходное значение. Если вы просто выполняете простое увеличение / уменьшение, не имеет значения, какую версию вы выберете. Но если вы используете этот оператор в части большего выражения, то тот, который вы выберете, может существенно изменить ситуацию.