Предварительное увеличение (или предварительное уменьшение) со ссылкой на L-значение в C++
Предварительное требование: предварительное и последующее увеличение в C/C++.
В C++ преинкремент (или предекремент) может использоваться как l-значение, но постинкремент (или постдекремент) не может использоваться как l-значение.
Например, следующая программа выводит a = 20 (++a используется как l-значение)
l-value — это не что иное, как ячейка памяти, у которой есть адрес.
Выход:
a = 20 a = 10
Временная сложность: O(1)
Приведенная выше программа работает, тогда как следующая программа не компилируется с ошибкой «не lvalue в присваивании» (a++ используется как l-значение)
Ошибка:
prog.cpp: In function "int main()": prog.cpp:6:5: error: lvalue required as left operand of assignment a++ = 20; // error ^
Чем ++a отличается от a++ как lvalue?
Это связано с тем, что ++a возвращает lvalue , которое по сути является ссылкой на переменную, которой мы можем присвоить значение — точно так же, как и обычной переменной. Его также можно присвоить ссылке следующим образом:
int &ref = ++a; // valid int &ref = a++; // invalid
В то время как если вы вспомните, как работает a++, он не сразу увеличивает значение, которое у него есть. Для ясности вы можете думать об этом как об увеличении в следующем выражении. Итак, что в основном происходит, так это то, что a++ возвращает rvalue , которое в основном является просто значением, подобным значению выражения, которое не сохраняется. Вы можете думать о а++ = 20; следующим образом после обработки:
int a = 10; // On compilation, a++ is replaced by the value of a which is an rvalue: 10 = 20; // Invalid // Value of a is incremented a = a + 1;
Это должно помочь понять, почему a++ = 20; не будет работать. Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по теме, обсуждаемой выше.