1

Тема: Пост-інкремент

Є простенький скрипт

var i = 0;
var c = 0;
while(c<5){
    i = i>0?5:i++;
    c++;
    console.log(i);
}

здається, все в ньому зрозуміло.

1. c<5 ? так
2. i>0 ? ні
3. i++ повертає 0, котрий заноситься в i
4. і тут, по ідеї, повинен спрацювати інкремент, тому i стає 1

але інкремент не спрацьовує!!! чому так?

2 Востаннє редагувалося Andriy92 (12.09.2017 13:22:16)

Re: Пост-інкремент

тому що спочатку компілятор присвоює значення, яке = 0, а потім вже спрацьовує збільшення на 1
тобто треба зробити ++i, щоб зберегти значення

3

Re: Пост-інкремент

>> i++ повертає 0

Повертає поточне значення змінної i, а це 0.
На кожній ітерації ви перезаписуєте i = i++ == i = 0, бо це операція присвоєння й змінна, яка інкрементується просто перезаписується.
Якби ви використовували преінкремент ++i, то все працювало б "як треба"

4

Re: Пост-інкремент

If the operator appears before the variable, the value is modified before the expression is evaluated. If the operator appears after the variable, the value is modified after the expression is evaluated. In other words, given j = ++k;, the value of j is the original value of k plus one; given j = k++;, the value of j is the original value of k, which is incremented after its value is assigned to j.

5

Re: Пост-інкремент

Почав писати про С та UB, але це JS. Тоді все тупо: i++ спрацьовує, заносить в i нове значення і повертає старе, а ПОТІМ спрацьовує = і заносить старе значення в i. Це в плюсах інкремент розкладається на дві операції, які компілятор як хоче переставляє.

Подякували: FakiNyan, Monolith, 0xDADA11C73

6 Востаннє редагувалося ping (12.09.2017 13:37:16)

Re: Пост-інкремент

    var i = 0;
    var c = 0;
    while(c<5){
        i = i>0 ? 5 : ++i;
        c++;
        console.log(i);
    }

якось тільки так працює

7

Re: Пост-інкремент

koala написав:

Почав писати про С та UB, але це JS. Тоді все тупо: i++ спрацьовує, заносить в i нове значення і повертає старе, а ПОТІМ спрацьовує = і заносить старе значення в i. Це в плюсах інкремент розкладається на дві операції, які компілятор як хоче переставляє.

так і думав, дякую за підтвердження