运算符优先级分组如何在C中用于*,/和%?

时间:2010-03-03 04:45:20

标签: c operator-precedence

参考C的O'Reilly口袋参考,我对*/%运算符的分组说明感到有些困惑。该书说分组从左到右发生 - 现在我认为我正在将评估顺序与分组混淆。鉴于下面的等式,以及从书中建立的规则,我会想到......

int x = 4 / 3 * -3

...评估为0,因为......

1: 4 / 3 * -3
2: 4 / -9
3: 0

...但是,它实际上是评估为-3,它似乎使用这种方法......

1: 4 / 3 * -3
2: 1 * -3
3: -3

为什么?

8 个答案:

答案 0 :(得分:7)

对我来说很有意义:

int x = 4 / 3 * -3;

从左到右分组,我们得到:

int x = (4 / 3) * -3
int x = ((4 / 3) * -3);

另见precedence table。它们具有相同的优先级,因此它们从左到右绑定。

答案 1 :(得分:5)

您需要了解运营商的优先级关联性

乘法(*)的优先级高于加法(+),这就是为什么2 + 3 * 4在C和普通数学中都被解释为2+(3 * 4)。但是在像2 * 3/4或2 * 3 * 4这样的表达式中,运算符都具有相同的优先级,您需要查看关联性。对于大多数操作员来说,它从左到右,这意味着您从左侧开始分组:2 * 3/4变为(2 * 3)/ 4,2 * 3 * 4 * 5变为((2 * 3)* 4 )* 5,等等。

例外是赋值,它是C中的运算符。赋值是右关联的,因此a = b = 3应该被读作a =(b = 3)。

任何好的C书或教程都应该有一个包含所有运算符的表(例如this one),同时具有优先级和关联性。

答案 2 :(得分:2)

访问以下网址。它非常有用C中的所有主题。因此您也可以使用运算符优先级。

 http://www.goldfish.org/books/The%20C%20Programming%20Language%20-%20K&R/chapter2.html#s2.12

答案 3 :(得分:1)

  

这里,它与系统识别保持联系。所以,它将执行第二个   仅用于评估表达式的示例。

答案 4 :(得分:1)

恕我直言,了解这些运算符优先级是很好的,但每当有疑问时最好使用括号:-)。正如大师所说,代码更多的是人类读者而不是机器;如果作者不确定,读者也不会。

答案 5 :(得分:0)

These links可以帮助你。

答案 6 :(得分:0)

乘法和除法是左关联的,所以第二个顺序是发生的 - 操作被分组为(4/3),然后结果乘以-3。

答案 7 :(得分:0)

对于数学,C就像你在高级学习中学到的一样。记住BODMAS(分区括号,乘法,加法和减法)。这意味着它从左到右查找计算。在这种情况下,它会看到4/3并计算答案,然后将答案乘以-3。您可以使用括号来修复它(4/(3*-3))。请查看this page以获取C命令运算符和执行计算的摘要。