Результатом унарного оператора +
является значение его (продвинутого) операнда. Целочисленные рекламные акции выполняются для операнда, и результат имеет повышенный тип. * введите продвижение к своим операндам. например,
char a = 6;
size_t size_pre_promotion = sizeof(a);
size_t size_post_promotion = sizeof(+a);
Где из-за повышения type
с char
до int
, размер операнд a
вырос с 1
до 4
. значение операнда возвращается без изменений.
Из комментариев: «превращение lvalue в rvalue», вот что Я не понимаю ...
Эффект помещения скобок вокруг (+1)
int j = (+i)++;
В этом выражении (+i)++
порядок приоритета принудительно устанавливается скобками ()
, чтобы выполнить преобразование i
(из выражения +i
) из lvalue
в rvalue
, за которым следует лексический оператор ++
в попытке увеличить значение i
. (lexically
, потому что это выражение никогда не перестанет существовать вне времени компиляции во время выполнения.) На этом этапе i
больше не является lvalue, следовательно, оно больше не может быть присвоено, поэтому не может принимать приращение операция, которая обычно происходила бы, если бы операнд все еще был lvalue.
Интересно отметить в качестве иллюстрации, что следующие выражения совершенно допустимы:
int j = (+i);//Not attempting to assign value (increment) the operand
//so the _value_ returned from the operand is successfully assigned
//to the lvalue `j`;
int j = +i++;//Assigns the i + 1 to j
//in this case the `++` adds `1` to the operand, then the `+` unary operator returns the incremented value (essentially a no-op at this point), which in turn is assigned to the _lvalue_ `j`.
Унарный оператор +
превращает lvalue
в rvalue
.
Термины можно рассматривать как присваиваемый и не назначаемый соответственно.
Как и показано этими выражениями:
int j;
&j; //address of an lvalue
является допустимым. Но:
&(+j);//cannot _take_ the address of an rvalue
нет.