2

我想澄清一些关于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 分支来确保摆脱麻烦,但我仍然想知道......

4

1 回答 1

3

根据Java 语言规范,第 15.25 章

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

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

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

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

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

于 2016-03-09T13:02:48.190 回答