Почему операция приращения ++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 не поддерживает такую операцию.