C如何用2个操作数求2个负号?

时间:2018-07-10 11:35:25

标签: c compiler-errors

考虑:

    int a;
    a = -3--3;
    printf("%d", a);

第二行(a = -3--3)产生编译时错误。
在添加一对额外的括号时,如下所示:

    int a;
    a = -3 - (-3);
    printf("%d", a);

错误消失。

由于方括号消除了该错误,因此我认为一定是造成歧义的原因。

但是我不明白为什么编译器会感到困惑。我尝试从-3中减去-3


感谢所有帮助。

2 个答案:

答案 0 :(得分:7)

C有一个拼写为--的一元减量运算符,还有一个“最大修改规则”,它使该运算符能够识别该运算符,而不是减号和负号,即使后者更有意义。出于大约六个附带的原因,3 -- 3毫无意义,您会得到一个错误。

如果您说的是a = -3 - -3;,那么您会没事的,而不是像空格键一样将所有东西塞在一起。 :P两个运算符之间的空格使C看不到--

答案 1 :(得分:1)

理所当然的是,您知道“-”代表一元运算符的前后减量,因此很容易理解编译器抛出错误的原因。

C编译器的解析器读取第一个减号,然后,它期望一个数字(表示您打算执行常规减法)或另一个减号(表示您打算执行预减数)一元运算。在您的情况下,您基本上是在告诉C编译器要执行递减操作。这样做有两个原因,这是没有道理的:

a)如果您实际上打算执行减量运算,则您缺少一个额外的二进制运算符(例如“ +”),就像这样:a = -3 +(--3)。

b)另一个原因(这也使我的上一个示例也抛出了编译时错误),原因是您试图对常量执行一元运算。这完全是无意义的,因为编译器会为以下常量保留内存:您稍后会尝试进行修改。

希望这有助于理解“ C”中的表达式概念,这对于初学者(甚至有时甚至是专家!)来说也令人头疼。

我的建议:保持代码整洁,有意义,并按照常识告诉您使用大括号,我认为这与您相反。