携手创作,共同成长!这是我参与「掘金日新计划 · 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;
例中,两个* 运算符并没有共享同一个运算对象,因此从左到右的结合律不适用。