java表达式的评估顺序

时间:2017-08-20 19:36:30

标签: java

所以我必须代表整数的arraylists例如num1 = <-1,4,5>代表-145而num2= <2,3,6>代表236.

ArrayList<Integer> num1 = new ArrayList<>(Arrays.asList(1,2,9));
ArrayList<Integer> num2 = new ArrayList<>(Arrays.asList(-5,5));
final int sign = num1.get(0) < 0 ^ num2.get(0) < 0 ? -1 : 1;

因此,符号应该确定将num1与num2相乘时会出现的符号(-145*236将为负数)。所以比较运算符是非关联的,所以这应该是一个等价的表达式:

sign = (num1.get(0) < 0 ^ num2.get(0)) && (0 ^ num2.get(0) < 0) ? -1:1;

令我感到困惑的是,为什么num2.get(0)被异或为0,因为这根本不会改变num2.get(0)

还可以说num2.get(0) = -2num1.get(0) = -3然后如果我们评估了符号,我们就会得到sign = -1。因为(-3< 0 ^ -2) AND (0 ^ -2 < 0)? -1:1;的计算结果为-1。

但这可能是错误的-3 * -2应该是一个正数。所以我错过了什么,因为我知道这段代码是正确的(它来自教科书)。

1 个答案:

答案 0 :(得分:4)

num1.get(0) < 0 ^ num2.get(0) < 0 ? -1 : 1

评估为

((num1.get(0) < 0) ^ (num2.get(0) < 0)) ? -1 : 1

这由运算符优先级决定。非关联的比较运算符与它无关。

  

令我感到困惑的是,为什么num2.get(0)被异或为0

不是。