Операторы увеличения (++
) и уменьшения (--
) изменяют то, что следует за ними. Вы не можете изменить литерал или константу. Напротив, операторы !
и ~
просто оперируют значением, а затем нигде не присваивают результат.
Грубо говоря, ++n
означает n = n + 1; n
. То есть «принять значение n
, добавить к нему единицу, записать это значение обратно в n
и вернуть новое значение в качестве значения выражения. " Так что ++0
будет означать 0 = 0 + 1; 0
: "взять значение 0
, добавить к нему единицу, записать это обратно в 0
и вернуть новое значение как результат выражения ". Литералы и константы не могут быть левосторонними значениями (их нельзя назначать).
Напротив, ~n
означает «принять значение n
и применить к нему побитовую операцию НЕ, вернуть результат как результат выражения». n
не изменяется, ~
не записывает обновленное значение в свой операнд.
Например:
int n = 0;
int a;
a = ~n;
printf("a = %d, n = %d\n", a, n); // "a = -1, n = 0" -- `n` is unchanged
против
int n = 0;
int a;
a = ++n;
printf("a = %d, n = %d\n", a, n); // "a = 1, n = 1" -- `n` is changed
Инкремент (++
) и декремент (--
) просто отличаются в этом отношении от !
или ~
(или, я думаю, любого другого унарного оператора - по крайней мере, я не могу немедленно подумайте о любых других, которые изменяют их операнд).