参考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
为什么?
答案 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)
答案 6 :(得分:0)
乘法和除法是左关联的,所以第二个顺序是发生的 - 操作被分组为(4/3),然后结果乘以-3。
答案 7 :(得分:0)
对于数学,C就像你在高级学习中学到的一样。记住BODMAS(分区括号,乘法,加法和减法)。这意味着它从左到右查找计算。在这种情况下,它会看到4/3
并计算答案,然后将答案乘以-3。您可以使用括号来修复它(4/(3*-3)
)。请查看this page以获取C命令运算符和执行计算的摘要。