2012-03-19 10 views
4

У меня возникли проблемы с пониманием следующего кода.Java pre и post incrementing

int count = 0; 
    for (int i = 0; i < 3; i++){ 
     count += (count++); 
     System.out.println("count = " + count); 
     System.out.println("i = " + i); 
    } 

Я понимаю, что цикл выполняется три раза для предварительной формовки следующий

count = count + count 
count = 1 + count 

Это приводит к следующему, как отсчет первоначально равно 0:

count = 0 + 0 
count = 1 + 0 = 1 
count = 1 + 1 = 2 
count = 1 + 2 = 3 
count = 3 + 3 = 6 
count = 6 + 1 = 7 

Выход ниже, и счет печатается как 0.

count = 0 
    i = 0 
    count = 0 
    i = 1 
    count = 0 
    i = 2 

Может кто-нибудь объяснить это мне? Благодаря

+4

Я понимаю, что для вопросов, связанных с домашним заданием/кодом, этот вопрос имеет смысл. Но никто не должен писать путаную строку, например 'count + = (count ++),' в производственной системе. –

+1

@MikeRyan Полностью согласен. Если кто-то спросил меня, что сделала эта линия, и я был в славном настроении, я бы ответил «это отклонит ваше предложение о слиянии». – yshavit

+0

Есть ли правило в FindBugs (или аналогичных инструментах с открытым исходным кодом), которое бы поймало это? –

ответ

3
count += (count++); 

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

in tmp = count;  // right hand side of += 
count = count + 1; // the count++ 
count = tmp + tmp; // executing count += tmp 

Как вы можете видеть count = count + 1 не имеет никакого эффекта, так как значение count переписывается в последней строке, и если count первоначально 0, то результат будет очевидно, count = 0 + 0 :-)

+1

, но tmp = 1 здесь? должно ли оно быть int tmp = count + 0? – oers

+1

Я думаю, что ваша первая строка должна быть 'int tmp = count + count;' – ccoakley

+2

Мне нравится этот пример лучше всего, если не учитывать ошибку в tmp = count + 1. – pillsdoughboy

7

Запутанной часть этой линии -

count+ = (count++); 

Это эффективно делает это -

count = count + (count++); 

Таким образом, значение (count++) для уравнения 0, то пост- приращение происходит после, но тогда count получает назначенное значение 0, поэтому пост-инкремент отбрасывается.

Это происходит 3 раза.