Почему операция приращения ++a++ не работает, по крайней мере, в C?

Мне было любопытно узнать, что текущий фрагмент кода не работает, но я не могу понять, почему:

#include <stdio.h>

void main(){
        int a = 42;
        printf("%d\n", ++a++);
}

Это не похоже на неправильный синтаксис для меня. Может ли кто-нибудь объяснить вывод ошибки?

first.c: In function ‘main’:
first.c:5:17: error: lvalue required as increment operand
  printf("%d\n", ++a++);

3 ответа

Решение

++a++ равно ++(a++) (из-за приоритета оператора) и значения, возвращаемого a++ является не-lvalue объектным выражением (также известным как rvalues).

Такие значения являются (по сути) эфемерными и не могут быть изменены префиксом ++ оператор.

В С, ++x это значение, а не lvalue. Его эффект заключается в увеличении xи оцените вновь присвоенное значение x, поскольку ++x не является lvalue, его нельзя увеличивать.

В C++ ++x это значение, а не значение. Его эффект заключается в увеличении xи оценить x как lvalue. Поскольку ++x снова является lvalue, его можно снова увеличить.

Причина, почему это имеет смысл для ++x быть lvalue в C++, потому что C++ ввел ссылочные типы. Дано

void f(int &);
int i;

может иметь смысл позвонить f(++i), который передает я по ссылке после его увеличения.

Поскольку C не имеет ссылочных типов, в ++ нет смысла быть lvalue. Исторически этого никогда не было, и, в отличие от C++, C никогда не получал убедительных причин для изменения правил.

Обратите внимание, что C++ потребовал более масштабных изменений, чем внесение ++x lvalue, чтобы фактически позволить этому работать. Изготовление ++x lvalue, без чего-либо еще, приведет к ++x неопределенному поведению, потому что не будет точки последовательности между модификацией x и последующим преобразованием lvalue в значение. Еще яснее ++++x, C++ должен был изменить правила последовательности, чтобы заставить это работать. В C изменения в правилах последовательности могут вызвать проблемы для существующих компиляторов, чтобы соответствовать новым правилам, поэтому такие изменения, вероятно, будут отклонены, если не будет большой выгоды.

Может ли кто-нибудь объяснить вывод ошибки?

Это означает, что C не поддерживает такую ​​операцию.

Другие вопросы по тегам