我偶然发现了一个关于测试中算术优先级的问题,但我无法完全回答它的问题。
float x = 5 % 3 * + 2 - 4.5 / 5 * 2 + 2;
我现在的“理解”是乘法必须先在除法和模数之前进行,但是当我尝试使用这种方法时,答案是6.55而不是4.20。我尝试使用表达式(在这里和那里添加括号),结果发现5%3首先发生在其他所有内容之前。我只是不明白为什么因为根据我提供的优先表,不应该是这种情况。有人能帮我解决这个问题吗?
答案 0 :(得分:2)
乘法,除法和余数运算符的优先级高于和和减法的优先级。
当乘法,除法或余数运算符一个接一个地运行时,它们是左关联,这意味着它们将按给定的顺序逐个执行。
在你的例子中,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)