++a = b
Операция не показывает ошибки, но a++ = b
показывает ошибку при компиляции с g++
, Обе переменные инициализируются перед этими операциями.
Хотя эти операции не имеют практического применения, я думаю, что они оба должны выдавать одну и ту же ошибку при компиляции. Как вы думаете? Если есть веская причина, пожалуйста, объясните мне. Заранее спасибо! 🙂
Постскриптум gcc
дает ошибку на обоих из них.
Давайте посмотрим, как выглядят объявления 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» с помощью оператора «=».
Результат, если ++a
является Lvalue, но результат a++
является Rvalue, Вы не можете ничего назначить Rvalue, отсюда и ошибка.
Разница в том, что (немного упрощая) Lvalue это выражение, которое относится к некоторому объекту, в то время как Rvalue относится к данные хранится где-то в памяти.
Скажем, результат a++
является 7
, В основном, когда вы пишете a++ = b;
вы пытаетесь назначить b
в 7
что явно не возможно.
Когда ты пишешь ++a = b;
с другой стороны, результатом приращения является Lvalue это относится к a
, так что назначение будет действительным.
Вы можете прочитать больше о Lvalues а также Rvalues Вот.
++a
является л-значение (с шагом a
и «возвращает» новое значение), a++
является г-значение (с шагом a
и «возвращает» временное со старым значением a
).
Как вы говорите, это не код, который имеет большой смысл, но я бы сказал, что ++a
увеличивает a и возвращает значение инкрементной переменной, а a++
возвращает значение переменной l, а затем увеличивает a (которое затем перезаписывается присваиванием). Вы не можете присвоить значение a, вам нужно lvalue (которое в основном является значением, которому выделена связанная память).