1

参考 O'Reilly 的 C 袖珍参考,我对 、 和 运算符的分组描述*有点/困惑%。这本书说分组是从左到右发生的——现在我想我把分组与评估顺序混淆了。鉴于以下等式,以及从书中建立的规则,我会认为......

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

这是为什么?

4

8 回答 8

7

It makes sense to me:

int x = 4 / 3 * -3;

Grouping left to right, we get:

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

Also see the precedence table. They are at the same precedence, so they bind left to right.

于 2010-03-03T04:48:37.107 回答
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 书籍或教程都应该有一个包含所有运算符的表(例如这个),具有优先级和关联性。

于 2010-03-03T07:28:45.893 回答
2

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

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

于 2010-03-03T07:15:31.673 回答
1

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

于 2010-03-03T05:29:49.547 回答
1

Here , it is left associative for system recognisation . So , it will execute second example only for evaluating the expression.

于 2010-03-03T04:56:13.407 回答
0

These links should help you out.

于 2010-03-03T04:49:36.043 回答
0

Multiply and divide are left associative, so the second order is what happens - the operation is grouped as (4/3), then the result is multiplied by -3.

于 2010-03-03T04:50:08.063 回答
0

For math, C works just like you learned in high scool. Remember BODMAS (Brackets of Division, multiplication, addition and subtraction). This means it looks for a calculation from the left to the right. In this case it sees 4/3 and calculates the answer, then multiplies the answer with -3. You can use brackets to fix that (4/(3*-3)). Have a look at this page for a summary of how C orders operators and performs the calculations.

于 2010-03-03T04:50:47.313 回答