2016-01-08 6 views
1

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

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 работает из-за заявления печати. Почему он не увеличивается до возврата, но выполняет метод addZero перед возвратом?

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

+0

Это семантика оператора ++, если _after_ операнд. –

+0

вам нужно понять, что означает ++. Это выражение всегда будет возвращать предыдущее значение. – awsome

+0

Ах, конечно. Спасибо всем: D – DrH

ответ

0

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

return a++; 

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

int x = a++; 
return x; 

Similary,

return a++ + addZero(); 

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

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

или:

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

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

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

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

+0

Вы можете использовать 'return ++ a', чтобы получить то, что вы хотите в одной команде. –

+0

@ Jean-BaptisteYunès Да, я это знаю. Я просто отвечал на вопрос, который был задан. – Eran

+0

Да, но было полезно видеть, что если я поймаю то, что оценивает ++, это будет не то же самое, что «a ++; return a; ' – DrH

1

От java doc:

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