Я только что узнал следующие факты:
Результатом приращения префикса (++имя_переменной) является R-значение в C (по крайней мере, я уверен, что это не L-значение в C), но это L-значение в C++.
Результатом приращения постфикса (var_name++) является R-значение в C (по крайней мере, я уверен, что это не L-значение в C). Это также верно в C++ (он говорит, что результатом является prvalue).
Я проверил их в VS2010 (.cpp и .c) и Ubuntu (gcc и g++).
В стр. 109 (5.3.2) стандарта C++ http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3242.pdf, написано
Операнд префикса ++ изменяется путем добавления 1 или устанавливается равным true, если это логическое значение (это использование не рекомендуется). Операнд должен быть модифицируемым lvalue. Тип операнда должен быть арифметическим типом или указателем на полностью определенный объектный тип. Результатом является обновленный операнд; это lvalue и...
и в п.101, (5.2.6)
Значением постфиксного выражения ++ является значение его операнда. ... Результатом является prvalue. Тип результата — это cv-неквалифицированная версия типа операнда. См. также 5.7 и 5.17.
(Хотя я не знаю разницы между R-value и prvalue).
Что касается стандарта C, http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf, префикс ++ описан в 6.5.3.1, а постфикс в 6.5.2.4, но из описания я не могу понять , однозначный ответ.
Я хотел бы знать причины, по которым они являются значением R или значением L. Все, что я знаю, это то, что
We can assign a value to a (modifiable) L-value, for example, a variable name. R-value is a value of an expression.
Но я не знаю подробностей, почему постфикс ++ не является L-значением в C и C++, и почему префикс ++ не является в C. (я видел что-то вроде «postfix ++. ..хранить...тогда по временному адресу...", но я так и не понял).
И еще вопрос, почему префикс ++ в C и C++ разный? Создание префикса ++ L-значением (в С++) имеет много преимуществ? Если да, то почему C не меняет этого? (Другие причины, кроме обратной совместимости, или, по крайней мере, почему ее изменение вызовет много проблем).
(a++) = 3
,(++a) = 3
. - person user565739   schedule 25.01.2014