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

Nic*_*ton 1 c operator-precedence

参照对于C O'Reilly的袖珍参考,我由说明书有点混乱为的分组*,/%运营商.这本书说分组是从左到右发生的 - 现在我觉得我的分组与评估顺序混淆了.考虑到下面的等式,以及从书中建立的规则,我会想到......

int x = 4 / 3 * -3
Run Code Online (Sandbox Code Playgroud)

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

1: 4 / 3 * -3
2: 4 / -9
3: 0
Run Code Online (Sandbox Code Playgroud)

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

1: 4 / 3 * -3
2: 1 * -3
3: -3
Run Code Online (Sandbox Code Playgroud)

这是为什么?

Mat*_*hen 7

对于我,这说得通:

int x = 4 / 3 * -3;
Run Code Online (Sandbox Code Playgroud)

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

int x = (4 / 3) * -3
int x = ((4 / 3) * -3);
Run Code Online (Sandbox Code Playgroud)

另请参阅优先级表.它们具有相同的优先级,因此它们从左到右绑定.


Tho*_*thy 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书或教程都应该有一个包含所有运算符(例如这个)的表,同时具有优先级和关联性.