我不太理解这个表达:
(x + y - 1) / y * y
运算符优先级如下(根据我的理解和K&R2,2.12表格2.1):
1)首先计算括号中的内容:首先是(x+y),然后是(x+y)-1。
2)'*'运算符的优先级高于'/',所以应该先计算它,但似乎先计算了(y*y),然后将(x+y-1)的结果除以这个积(y*y)。我不太明白。
3)我曾听说通常采用这种形式进行四舍五入:
(x + y - 1) / y * y
这是正确的吗?非常感谢您的帮助!
我不太理解这个表达:
(x + y - 1) / y * y
(x + y - 1) / y * y
这是正确的吗?非常感谢您的帮助!
一元运算符*
的优先级高于/
,但这是用于指针解引用。
乘法*
和除法/
具有相同的从左到右优先级。
*
和/
具有相同的优先级(称为“precedence”,而非“priority”)。(x + y - 1) / y * y
将会是
( ( (x+y) - 1 ) / y ) * y
*
/ \
/ y
÷
/ \
/ y
-
/ \
/ 1
+
/ \
x y
如前所述,"*"和"/"具有相同的优先级,因此它们从左到右进行计算。完全消除歧义的表达式为:
( ( ( (x + y) - 1) / y) * y)
1)正确
2)不, "/" 和 "*" 具有相同的优先级。因此它们将从左到右执行。
3)我不明白你的“round up”的意思。但是例如:
当 y = 2,x = 2 时
(x + y -1) / y * y = (2 + 2 - 1) / 2 * 2 = (3 / 2) * 2 = 1 * 2 = 2
3 / 2 = 1,因为这是整数除法。
(x + y - 1) / y * y = z / y * y // where z = x + y -1
= (z / y) * y // because of associativity.
我可能错了,但据我回忆,'/'和'*'的优先级相同。所以结果应该是(x+y+1)。
如果你想要结果为(x+y+1)/(y*y),也许你应该说出来。
无论如何,消除歧义从来不会花费太多。
至于使用((x+y-1)/y)*y向上或向下舍入,这是一个可疑且不太可移植的做法。原因有几个:1/你必须知道或记住y是某种int类型,2/x也必须是某种int类型,3/结果可能因编译器而异。