Почему несколько операторов декремента не работают в C, когда они работают в C ++?

Смотря на этот вопрос и опробовать часть кода:

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?

47

Решение

В С, --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 изменения в правилах последовательности могут вызвать проблемы для существующих компиляторов, чтобы соответствовать новым правилам, поэтому такие изменения, вероятно, будут отклонены, если не будет большой выгоды.

88

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

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector