C算术优先级

时间:2016-12-17 17:05:39

标签: c arithmetic-expressions

我偶然发现了一个关于测试中算术优先级的问题,但我无法完全回答它的问题。

float x = 5 % 3 * + 2 - 4.5 / 5 * 2 + 2;

我现在的“理解”是乘法必须先在除法和模数之前进行,但是当我尝试使用这种方法时,答案是6.55而不是4.20。我尝试使用表达式(在这里和那里添加括号),结果发现5%3首先发生在其他所有内容之前。我只是不明白为什么因为根据我提供的优先表,不应该是这种情况。有人能帮我解决这个问题吗?

3 个答案:

答案 0 :(得分:2)

请参阅documentation here

乘法,除法和余数运算符的优先级高于和和减法的优先级。

当乘法,除法或余数运算符一个接一个地运行时,它们是左关联,这意味着它们将按给定的顺序逐个执行。

在你的例子中,5 % 3将首先执行,然后是乘法(通过任何数字),然后是除法4.5 / 5,然后将结果乘以2,并且仅在所有这些之后执行和和减法被执行。

答案 1 :(得分:1)

您的C代码:

x = 5 % 3 * + 2 - 4.5 / 5 * 2 + 2;

首先,一元加和一元减号具有最高优先级:

x = 5 % 3 * (+ 2) - 4.5 / 5 * 2 + 2;

其次,乘法,除法和余数具有相同的优先级,从左到右关联:

x = ((5 % 3) * (+ 2)) - ((4.5 / 5) * 2) + 2;

最后,加法和减法具有相同的优先级,从左到右关联:

x = ((((5 % 3) * (+ 2)) - ((4.5 / 5) * 2)) + 2);

现在我们评估表达式:

x = (((2 * (+ 2)) - ((4.5 / 5) * 2)) + 2);
x = (((2 * 2) - ((4.5 / 5) * 2)) + 2);
x = ((4 - ((4.5 / 5) * 2)) + 2);
x = ((4 - (0.9 * 2)) + 2);
x = ((4 - 1.8) + 2);
x = (2.2 + 2);
x = 4.2;

答案 2 :(得分:0)

您可以参考此链接了解更多详情 http://www.difranco.net/compsci/C_Operator_Precedence_Table.htm