gcc — странный опыт работы с C ++ preIncrement и postIncrement

++a = b Операция не показывает ошибки, но a++ = b показывает ошибку при компиляции с g++, Обе переменные инициализируются перед этими операциями.

Хотя эти операции не имеют практического применения, я думаю, что они оба должны выдавать одну и ту же ошибку при компиляции. Как вы думаете? Если есть веская причина, пожалуйста, объясните мне. Заранее спасибо! 🙂

Постскриптум gcc дает ошибку на обоих из них.

3

Решение

Давайте посмотрим, как выглядят объявления pre / post-increment ( http://en.cppreference.com/w/cpp/language/operator_incdec ):

++a: T& operator ++(T& a);
a++: T operator ++(T& a, int);

И у вас есть ответ — preInc возвращает ссылку, так что вы можете переопределить переменную «a» с помощью оператора «=».

8

Другие решения

Результат, если ++a является Lvalue, но результат a++ является Rvalue, Вы не можете ничего назначить Rvalue, отсюда и ошибка.

Разница в том, что (немного упрощая) Lvalue это выражение, которое относится к некоторому объекту, в то время как Rvalue относится к данные хранится где-то в памяти.

Скажем, результат a++ является 7, В основном, когда вы пишете a++ = b; вы пытаетесь назначить b в 7 что явно не возможно.
Когда ты пишешь ++a = b;с другой стороны, результатом приращения является Lvalue это относится к a, так что назначение будет действительным.

Вы можете прочитать больше о Lvalues а также Rvalues Вот.

6

++a является л-значение (с шагом a и «возвращает» новое значение), a++ является г-значение (с шагом a и «возвращает» временное со старым значением a).

3

Как вы говорите, это не код, который имеет большой смысл, но я бы сказал, что ++a увеличивает a и возвращает значение инкрементной переменной, а a++ возвращает значение переменной l, а затем увеличивает a (которое затем перезаписывается присваиванием). Вы не можете присвоить значение a, вам нужно lvalue (которое в основном является значением, которому выделена связанная память).

1
По вопросам рекламы [email protected]