2013-05-02 4 views
4

Какова логика этого поведения?i и i = i ++ in for loop java

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

Output=10; //Exepcted 



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

Output=0; //Surprised :) 

Может ли кто-нибудь пролить свет на вышеуказанные функции?

+0

какой? это тот же код – Axarydax

+0

@ Вторая версия Axarydax имеет «i = i ++», а не просто «i ++» – Rup

+0

http://stackoverflow.com/questions/7911776/what-is-x-after-xx – NINCOMPOOP

ответ

8

Смотрите этот блестящий ответ:

x = x++; 

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

int tmp = x; 
x++; 
x = tmp; 

От this question.

6

i = i++ является оператором приращения постфикса - это увеличивает i, а затем возвращает его к исходному значению (., Так как i++ по существу «возвращает» значение i, прежде чем он был увеличен)

i = ++i будет работать, так как это prefix increment operator, и вернет значение I после приращения. Тем не менее, вы, вероятно, просто хотите сделать i++ там без каких-либо дополнительных назначений, как и в первом прогоне - это (по существу) стенография, как и для i = i+1.

3

Что происходит, потому что Java является передачей по значению.

В первом цикле, i становится увеличивается в i++ заявления, однако, во втором цикле, что происходит в том, что i получает указал на новое место памяти, которая хранит значение i (в данном случае 0), а затем увеличивает старое местоположение.

Для визуализации:

i => 0x00000001 // 0 

for() { 
    i => 0x00000002 <- 0 // store old i value (0) in new location 
    0x00000001++   // Increment the value stored at the old location 

    // Cause there is no longer a reference to 0x00000001, 
    // it will get garbage collected and you will be left with 
    // i => 0x00000002 

И он будет продолжать делать то, что, назначая старое значение на новое место и приращение старого значения для каждого прохода цикла

1

Оператор ++ обрабатывается после распайка,

если вы изменили его i=++i; вы, вероятно, получите поведение, которое вы ожидали

+0

Ну да. Но вы не должны рекомендовать плохое решение. Лучшими решениями являются 'i ++;' или 'i + = 1;' или 'i = i + 1;'. –

+0

согласен, 'i = ++ i;' никогда не будет использоваться на практике – paul

2

i=i++; никогда не будет увеличивать i, потому что ++ обрабатывается после i = i.

вы могли видеть это так:

int i=0; 
for(int k=0;k<10;k++){ 
    int j = 0; 
    i = j; 
    j = j + 1; 
} 
1

В первом варианте, вы приращение I с помощью i++, что эквивалентно i=i+1, так что это увеличивает стоимость я 10.
, но во втором варианте, вы assining IA нового значения, следовательно, получать одинаковое значение каждый раз.

2
i = i++; 

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

int temp = i; // temp = 0 
i++; // i=1 
i = temp; // i = 0 
1

I = I ++;

возвращает i и увеличивается. поэтому приращение теряется ... посмотрите на этот псевдо-код

х = я ++ нарушит работу в следующих шагах

x = i; 
i++; 

в вашем случае она возвращает 0 приращения к 1 (но приращение теряется)

Смежные вопросы