Выражения x++
и ++x
имеют как результат (значение), так и побочный эффект .
Результат выражения x++
является текущим значением x
. Побочный эффект заключается в том, что содержимое x
увеличивается на 1.
Результат выражения ++x
является текущим значением x
plus 1. Побочный эффект такой же, как указано выше.
Обратите внимание, что побочный эффект не нужно применять сразу после вычисления выражения; это должно только быть применено перед следующей точкой последовательности. Например, учитывая код
x = 1;
y = 2;
z = ++x + y++;
нет никакой гарантии, что содержимое x
будет изменено до вычисления выражения y++
или даже до того, как результат ++x + y++
будет присвоен z
(ни =
, ни +
операторы вводят точку последовательности). Выражение ++x
оценивается как 2, но возможно, что переменная x
может не содержать значение 2 до тех пор, пока не будет присвоено z
.
Важно помнить, что поведение выражений типа x++ + x++
явно не определено стандартом языка; нет (хорошего) способа предсказать, каким будет результат выражения или какое значение x
будет содержать после его оценки.
Операторы Postfix имеют более высокий приоритет, чем унарные операторы, поэтому такие выражения, как *p++
, анализируются как *(p++)
(т.е. вы применяете оператор *
к результату выражения p++
). Опять же, результатом выражения p++
является текущее значение p
, поэтому while (*p++=*q++);
не пропускает первый элемент.
Обратите внимание, что операндом операторов автоинкремента / декремента должно быть lvalue (по сути, выражение, которое относится к ячейке памяти, так что память может быть прочитана или изменена). Результат выражения x++
или ++x
равен , а не lvalue, поэтому вы не можете писать такие вещи, как ++x++
или (x++)++
или ++(++x)
. Вы могли бы написать что-то вроде ++(*p++)
(p++
не lvalue, но *p++
is), хотя это, вероятно, даст вам пощечину любому, кто читает ваш код.