int j = ++val++; //gives compilation error
Это потому, что вы не можете предварительно увеличить rvalue
. ++val++
интерпретируется как ++(val++)
, потому что оператор постинкремента имеет более высокий приоритет, чем оператор предварительного инкремента. val++
возвращает rvalue
, а для оператора предварительного приращения требуется, чтобы его операнд был lvalue
. :)
int k = ++*p++; //no error
++*p++
интерпретируется как ++(*(p++))
, что совершенно правильно.