Смотря на этот вопрос и опробовать часть кода:
int x = 100;
while ( 0 <-------------------- x )
{
printf("%d ", x);
}
Я попытался скомпилировать с gcc
и получил следующую ошибку:
file.c: In function 'main':
file:c:10:27: error: lvalue required as decrement operand
while ( 0 <-------------------- x )
Но составление с g++
работает. Почему этот код действителен в C ++, но не в C?
В С, --x
это значение, а не lvalue. Его эффект заключается в уменьшении x
и оцените вновь присвоенное значение x
, поскольку --x
не является lvalue, оно не может быть уменьшено.
В C ++ --x
это значение, а не значение. Его эффект заключается в уменьшении 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 в значение. Еще яснее ----x
, C ++ должен был изменить правила последовательности, чтобы заставить это работать. В C изменения в правилах последовательности могут вызвать проблемы для существующих компиляторов, чтобы соответствовать новым правилам, поэтому такие изменения, вероятно, будут отклонены, если не будет большой выгоды.
Других решений пока нет …