如何评估多个减号运算符?

时间:2016-02-16 15:55:55

标签: c

int main( void )
{

    int a, b,c ;
    a = -3 - - 3 ;
    b = -3 - - ( - 3 ) ;
    c= -3 - - - -3;

    printf ( "a = %d b = %d c=%d", a, b ,c) ;
}

这是问题,找到答案我只是运行程序并找到结果

  

a = 0 b = -6 c = 0

但我不应该在回答这些问题时使用电脑。所以这是一个问题:无论如何,任何' - '标志都有编译器会让它正确吗?有一对支撑'b'而不是'c',显然没有区别。有人请解释一下吗?

谢谢。

3 个答案:

答案 0 :(得分:7)

每个一元-否定了它之前的表达,并从右到左结合。此外,它具有更高的优先级,即从左到右绑定的二进制-运算符。所以这个:

c= -3 - - - -3;

与:

相同
c= (-3) - (- (- (-3)));

是的,这些表达式的结果已经明确定义。

另一方面,如果你正在处理preincrement或postincrement运算符--++,并尝试在同一个表达式中多次在同一个变量上使用它们,那就是你运行的时候进入undefined behavior

答案 1 :(得分:0)

这只是改变标志

a = -3 - -3 = -3 + 3 = 0
b = -3 - - (- 3) = -3 - (+3) = -3 - 3 = -6
c = -3 - - - -3 = -3 - - 3 = -3 + 3 = 0

答案 2 :(得分:-1)

-3 - - ... - - 3读为负三负负...负负3.