c语言中运算符的优先级

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第14天,点击查看活动详情

c语言运算顺序有规定:通过运算符的优先级来解决操作顺序的问题。每个运算符都有自己的优先级。

看个例子

butter = 25.0 + 60.0 * n / SCALE;运算顺序:

60.0* n 首先计算表达式中* 或/(假设n的值是6,所以60.0* n得360.0)
360.0/SCALE 然后计算表达式中第2个* 或 /
25.0+180 最后计算表达式里第一个+或-,结果为205.0(假设SCAKLE的值是2.0)

如何让加法运算在除法前执行呢?

可以使用括号:

flour = (25.0 + 60.0 * n )/ SCALE;
最先执行圆括号中的部分。圆括号内部按正常的规则执行。该例中,先执行乘法运算,再执行加法运算。执行完圆括号中的表达式后,用结果除以SCALE。

看一个常用的运算符优先级

运算符 结合律
() 从左往右
+ -(一元) 从右往左
* / 从左往右
+ -(二元) 从左往右
= 从右往左

注意:正号(加号)和负号(减号)的两种不同用法。结合律栏列出了运算符如何与运算对象结合。例如,一元负号与它右侧的量相结合,在除法中用除号左侧对象除以右侧的运算对象。

优先级和求值顺序

运算符优先级为表达式中求值顺序提供重要的依据,但是并没有规定所有的顺序。例如下面这个语句:

y = 6*12+5*20;

当运算符共享一个运算对象时,优先级决定了求值顺序。 例如上面语句,12是* 和+运算符的运算对象。根据运算符的优先级,乘法的优先级比加法高,所以先进行乘法运算。类似的,先对5进行乘法运算而不是加法运算。简而言之,先进行两个乘法运算6* 12和5 * 20,在进行加法运算。虽然优先级并未规定先进行哪个乘法,但是表达式都会简化成72+100,不影响最终结果。

但是,大家可能会根据乘法结合律而从左往右,认为应该执行+运算符左边的乘法。结合律只适用于共享同一运算对象运算符。 例如,在表达式12/3* 2中,/和* 的运算符的优先级相同,共享运算对象3.因此,从左往右的结合律在这种情况下适用。 表达式简化为4* 2,即8(如果从左到右计算,会得到12/6,即2,在这种情况下计算的先后顺序会影响结果).在y = 6*12+5*20;例中,两个* 运算符并没有共享同一个运算对象,因此从左到右的结合律不适用。

猜你喜欢

转载自juejin.im/post/7130473020434415629