Java三元运算符:在ART上行为类似于条件移动(汇编)吗?

时间:2016-03-09 12:45:30

标签: java android ternary-operator android-runtime

我想清楚一些关于Java中三元运算符的疑问。

在Java中,它看起来像: x =(c?a:b)。从我阅读和经历的内容来看,它似乎是作为一个分支if / else执行,这意味着只评估一个语句(a或b,但绝不是两者)。我想知道它是否总是如此。

在C中,它可能被编译成条件移动,它会计算表达式a和b。

准确地说,我想知道Android代码是否也是如此。知道Java字节码在安装到具有最新操作系统的设备上时实际上已转换为本机指令(请参阅Android Runtime(ART))。 ART之后是否存在有条件移动的风险?

我们举一个例子。一个基本类,包含:

//class content

int victoriesA = 0;
int nonVictoriesA = 0;
int totalCalls = 0;

//...class content

public int getIncrementedCounter(int goalsA,int goalsB){
    totalCalls++;
    return (goalsA > goalsB ? ++victoriesA : ++nonVictoriesA);
}

public boolean testOpertor(){
    return (totalCalls == victoriesA + nonVictoriesA);
}

如果在执行程序期间多次调用 getIncrementedCounter ,函数 testOperator 是否总是返回true? (假设代码在单个线程上运行)

我知道我应该使用if / else分支来确保摆脱麻烦,但我仍然想知道......

1 个答案:

答案 0 :(得分:3)

根据Java Language Specification, chapter 15.25

  

在运行时,首先计算条件表达式的第一个操作数表达式。如有必要,将对结果执行取消装箱转换。

     

然后使用得到的布尔值来选择 第二个第三个操作数表达式:

     

如果第一个操作数的值为true,则选择第二个操作数表达式。

     

如果第一个操作数的值为false,则选择第三个操作数表达式。

符合语言规范意味着只评估1个表达式。