Как унарные операторы работают в C, вы не можете предварительно увеличить ноль - PullRequest
2 голосов
/ 28 июня 2011

Я не совсем понимаю, как работают унарные операторы в C для дополнения единиц, логического отрицания и преинкрементации.

Дополнение единиц работает против 0 следующим образом:

int main()
{
    int a;
    a = ~0;          // Ones complement
    printf("%d",a);  // prints as -1.
}

И против логического отрицания0, например:

int main()
{
    int a;
    a = !0;          // Logical negation
    printf("%d",a);  // prints as 1.
}

Но предварительное добавление к 0 приводит к ошибке компилятора:

int main()
{
    int a;
    a = ++0;        //pre incrementing 0.  error: non-lvalue in increment
    printf("%d",a); 
}

Почему все три не работают, учитывая, что все они являются унарными операторами?

Ответы [ 3 ]

12 голосов
/ 28 июня 2011

Операторы увеличения (++) и уменьшения (--) изменяют то, что следует за ними. Вы не можете изменить литерал или константу. Напротив, операторы ! и ~ просто оперируют значением, а затем нигде не присваивают результат.

Грубо говоря, ++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

Инкремент (++) и декремент (--) просто отличаются в этом отношении от ! или ~ (или, я думаю, любого другого унарного оператора - по крайней мере, я не могу немедленно подумайте о любых других, которые изменяют их операнд).

4 голосов
/ 28 июня 2011

++ и -- не просто применяют операцию к значению, они изменяют само значение. Такое поведение не имеет большого смысла для литерала.

Другие унарные операторы, к которым вы обращаетесь, а именно ~ и !, не изменяют значение своего операнда, они просто выполняют операцию над его значением.

2 голосов
/ 28 июня 2011

Вы пытаетесь увеличить буквальное значение.Начиная с операции x ++;является синонимом для x = x + 1;это означает, что вы пытаетесь установить новое значение для 0, которое не является переменной.

...