Вывод программы не имеет смысла - PullRequest
0 голосов
/ 07 сентября 2018

Я не понимаю логику этого ..
Я ожидаю, что эта программа выдаст 2, но выдает 3
Можете ли вы объяснить работу следующего кода:

#include <stdio.h>

int main()
{    int a = - -3; 

    printf("a=%d", a);

    return 0;
}

Ответы [ 3 ]

0 голосов
/ 07 сентября 2018

В

int a = - -3;

в этом утверждении нет --(decrement operator), это унарный минус оператор, который делает - -3 как 3(cancelling negation). Следовательно это печатает 3.

Примечание, если вы думаете об этом

int a = --3;

as печатает 2, тогда вы думаете, что неправильно, так как это вызывает lvalue error , потому что -- применимо к переменной, а не к константе. Правильный -

int a = 3;
--a ;/* this is valid,this make a as 2 now */
0 голосов
/ 07 сентября 2018
a = - -3;

анализируется как

a = - (-3);

так что вы отрицаете отрицательный 3, давая положительный 3.

Если вы намеревались написать

a = --3;

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

0 голосов
/ 07 сентября 2018

- -3 является двойным и поэтому отменяет отрицание.

Это выражение равно 3. Помимо -INT_MIN, который не определен в системе дополнения 2, двойное отрицание эквивалентно унарному плюс плюс +.

Если бы вы написали --3, то правило maxim munch скомпилировало бы это как попытку уменьшить константу 3, что недопустимо, и компиляция потерпеть неудачу.

...