Почему несколько операторов декремента не работают в 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 голосов | спросил MD XF 21 FebruaryEurope/MoscowbTue, 21 Feb 2017 02:17:00 +0300000000amTue, 21 Feb 2017 02:17:00 +030017 2017, 02:17:00

1 ответ


0

В C --x - это значение, а не значение. Его эффект заключается в уменьшении x и вычислении вновь присвоенного значения x. Поскольку --x не является l-значением, его нельзя уменьшить.

В C ++ --x является l-значением, а не r-значением. Его эффект заключается в уменьшении x и оценке до x как значение. Поскольку --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 и последующим преобразованием значения в значение не будет точки последовательности , Еще более ясно это для ----x. C ++ должен был изменить правила последовательности, чтобы заставить это работать. В C изменения в правилах последовательности могут привести к тому, что существующие компиляторы не смогут соответствовать новым правилам, поэтому такие изменения могут быть отклонены, если не будет большой выгоды.

ответил 21 FebruaryEurope/MoscowbTue, 21 Feb 2017 02:22:31 +0300000000amTue, 21 Feb 2017 02:22:31 +030017 2017, 02:22:31

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132