В C --x
это значение, а не значение lvalue. Его эффект заключается в уменьшении x
и вычислении на вновь присвоенное значение x
. Поскольку --x
не является значением lvalue, оно не может быть уменьшено.
В C++, --x
- это значение lvalue, а не rvalue. Его эффект заключается в уменьшении x
и оценивании до x
как lvalue. Так как --x
снова является значением lvalue, его можно снова уменьшить.
Причина, по которой для --x
имеет значение lvalue в C++, заключается в том, что C++ вводил ссылочные типы. Учитывая
void f(int &);
int i;
может иметь смысл называть f(--i)
, который проходит i
по ссылке после декремента его.
Поскольку C не имеет ссылочных типов, в --i
есть небольшая точка, являющаяся значением lvalue. Исторически это никогда не было, и в отличие от C++, C никогда не получал веских оснований менять правила.
Обратите внимание, что C++ требует более обширных изменений, чем принятие --x
lvalue, чтобы фактически позволить ему работать. Создание --x
lvalue, без чего-либо еще, приведет к неопределенному поведению --x
, поскольку между модификацией до x
и последующим преобразованием lvalue-to-value не будет точки последовательности. Еще более ясно, поэтому для ----x
. C++ должен был изменить правила последовательности, чтобы заставить его работать. В C изменения правил последовательности могут привести к тому, что существующие компиляторы будут соответствовать новым правилам, поэтому такие модификации, вероятно, будут отвергнуты, если не будет большой выгоды.
Поскольку C и C++ - это два разных языка. Другими словами, C и C++ не являются одним и тем же языком. –
Поскольку оператор down '<-' может растягиваться на C++ много раз, если вы хотите быстрее уменьшить: '<----' is downtoby2, '<-------------- ------ 'is downtoby10 – chqrlie
@chqrlie Циркулярное рассуждение. В: Почему вода выходит из моего крана, а не Пепси? A: Поскольку краны можно использовать для легкого доступа к воде. – immibis