java 中包含括号和 int 的表达式中的优先级
Precedence in expression including parentheses and int cast in java
我的代码中有以下表达式
int n = ((int) Math.sqrt(4 * 4 + 5) - 1) / 2;
谁能告诉我计算表达式的优先级?
从逻辑上讲,我将按以下方式评估表达式:
4 * 4 + 5 = 16 + 5 = 21
Math.sqrt(21) ~ 4.58
4.58 - 1 = 3.58
(整数) 3.58 = 3
3 / 2 = 1.5
但是代码的计算结果为 1。
你差不多明白了。唯一的区别(对结果无关紧要)是对演员表进行了评估
在减法之前,您使用的是整数除法:
- 4 * 4 + 5 = 16 + 5 = 21
- Math.sqrt(21) ~ 4.58
- (int) 4.58 = 4 (先施法)
- 4 - 1 = 3
- 3 / 2 = 1 (integer division)
您建议的顺序是正确的。
关键点是最后一个操作:int
除以 int
的结果也是 int
。
要解决此问题,两个数字之一应该是 float
(或 double
):
float n = ((float)(int) (Math.sqrt(4 * 4 + 5) - 1)) / 2;
这样,您将 float
除以 int
,结果将是 float
。
或者更好:
double n = (Math.sqrt(4 * 4 + 5) - 1) / 2;
因为 Math.sqrt()
转换为 int 没有用。
请注意,第一个操作完全符合您在 Math.sqrt() 轮次中的要求,而第二个操作则没有。
我的代码中有以下表达式
int n = ((int) Math.sqrt(4 * 4 + 5) - 1) / 2;
谁能告诉我计算表达式的优先级?
从逻辑上讲,我将按以下方式评估表达式:
4 * 4 + 5 = 16 + 5 = 21
Math.sqrt(21) ~ 4.58
4.58 - 1 = 3.58
(整数) 3.58 = 3
3 / 2 = 1.5
但是代码的计算结果为 1。
你差不多明白了。唯一的区别(对结果无关紧要)是对演员表进行了评估 在减法之前,您使用的是整数除法:
- 4 * 4 + 5 = 16 + 5 = 21
- Math.sqrt(21) ~ 4.58
- (int) 4.58 = 4 (先施法)
- 4 - 1 = 3
- 3 / 2 = 1 (integer division)
您建议的顺序是正确的。
关键点是最后一个操作:int
除以 int
的结果也是 int
。
要解决此问题,两个数字之一应该是 float
(或 double
):
float n = ((float)(int) (Math.sqrt(4 * 4 + 5) - 1)) / 2;
这样,您将 float
除以 int
,结果将是 float
。
或者更好:
double n = (Math.sqrt(4 * 4 + 5) - 1) / 2;
因为 Math.sqrt()
转换为 int 没有用。
请注意,第一个操作完全符合您在 Math.sqrt() 轮次中的要求,而第二个操作则没有。