Це стосується lvalues і rvalus в C і C ++.
У мові програмування на С і оператори до збільшення, і операції після збільшення повертають rvalues, а не lvalues. Це означає, що вони не можуть знаходитись зліва від =
оператора призначення. Обидва ці твердження дадуть помилку компілятора в C:
int a = 5;
a++ = 2; /* error: lvalue required as left operand of assignment */
++a = 2; /* error: lvalue required as left operand of assignment */
Однак у C ++ оператор попереднього збільшення повертає значення " lvalue" , тоді як оператор "post-increment" повертає rvalue. Це означає, що вираз з оператором попереднього збільшення може бути розміщено зліва від =
оператора присвоєння!
int a = 5;
a++ = 2; // error: lvalue required as left operand of assignment
++a = 2; // No error: a gets assigned to 2!
Тепер чому це так? Посткремент збільшує змінну, і вона повертає змінну такою, якою вона була до того, як приріст відбувся. Це насправді просто оцінка. Колишнє значення змінної a копіюється в регістр як тимчасове, а потім a збільшується. Але колишнє значення a повертається виразом, воно є оцінкою. Він більше не представляє поточний вміст змінної.
Попередній приріст спочатку збільшує змінну, а потім повертає змінну, як це було після того, як приріст відбувся. У цьому випадку нам не потрібно зберігати старе значення змінної у тимчасовий регістр. Ми просто отримуємо нове значення змінної після її збільшення. Отже, попередній приріст повертає lvalue, він повертає змінну a собі. Ми можемо використовувати присвоєння цього значення іншому, це як наступне твердження. Це неявна конверсія lvalue у rvalue.
int x = a;
int x = ++a;
Оскільки попередній приріст повертає значення, ми можемо також призначити йому щось. Наступні два твердження ідентичні. У другому призначенні спочатку a збільшується, потім його нове значення перезаписується на 2.
int a;
a = 2;
++a = 2; // Valid in C++.