Предварительное увеличение (или предварительное уменьшение) со ссылкой на L-значение в C++

Опубликовано: 15 Сентября, 2022

Предварительное требование: предварительное и последующее увеличение в 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; не будет работать. Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по теме, обсуждаемой выше.

C++ C