程序输出没有意义

Output of program does not make sense

我不明白这背后的逻辑..
我希望这个程序输出 2 但它输出 3
您能解释一下以下代码的工作原理吗:

#include <stdio.h>

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

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

    return 0;
}

- -3 是双重的,因此取消否定。

是一个等于3的表达式。除了-INT_MIN在2的补码系统上未定义,双重否定等价于一元加+

如果您编写了 --3,那么 maximal munch 规则会将其编译为试图 递减 常量3,这是不允许的,编译会失败。

int a = - -3;

这个语句没有--(decrement operator),它是一元减运算符,使得- -33(cancelling negation)。因此它打印 3.

旁注,如果你想到这个

int a = --3;

as prints 2 然后你认为错误,因为这导致 左值错误 因为 -- 适用于变量而不是常量。正确的是

int a = 3;
--a ;/* this is valid,this make a as 2 now */
a = - -3;

被解析为

a = - (-3);

所以你否定了负数 3,给出了正数 3

如果你打算写

a = --3;

那么你会得到一个编译时错误,因为 -- 运算符不能应用于常量表达式。