我写了一段简单的代码 - ceil1
。由于在重写相同代码后我的测试用例失败了 - ceil
工作。
public class Test {
public static void main(String args[]){
System.out.println(ceil(3, 2)); //getting 2
System.out.println(ceil1(3, 2)); //getting 1
}
public static int ceil(int dividend, int divisor){
int a = dividend/divisor;
int b = dividend%divisor == 0 ? 0:1;
return a+b;
}
public static int ceil1(int dividend, int divisor){
return dividend/divisor + dividend%divisor == 0 ? 0:1;
}}
我无法理解这两者之间的区别? 可能是中间计算/运算符优先级导致此乱码。
答案 0 :(得分:3)
在
return dividend/divisor + dividend%divisor == 0 ? 0:1;
添加
dividend/divisor + dividend%divisor
执行,然后将结果与0进行比较。
你想:
return dividend/divisor + (dividend%divisor == 0 ? 0:1);
或
return dividend/divisor + (dividend%divisor == 0) ? 0:1;
为了只将dividend%divisor
与0
进行比较。
答案 1 :(得分:1)
加法(+
)运算符的优先级高于三元(?
)运算符。您可以用括号括起该表达式以获得所需的行为:
public static int ceil1(int dividend, int divisor){
return dividend/divisor + (dividend%divisor == 0 ? 0:1);
}
答案 2 :(得分:1)
所有/
,+
,%
都有higher precedence而不是==
,因此
dividend/divisor + dividend%divisor == 0 ? 0:1
相当于
(dividend/divisor + dividend%divisor) == 0 ? 0:1
所以你总是得到0或1。
答案 3 :(得分:1)
无论优先级问题如何,您的代码都会产生错误答案。
例如,public interface FooInterface {
int getBar();
}
返回0,而ceil(-5, 3)
返回-1(“un-ceiled”值为Math,ceil(-5.0 / 3.0)
)。
如果您使用更简单的方法,您将得到正确的答案:
-1.666667