Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java三元运算符:行为是否类似于ART上的条件移动(组装)?_Java_Android_Ternary Operator_Android Runtime - Fatal编程技术网

Java三元运算符:行为是否类似于ART上的条件移动(组装)?

Java三元运算符:行为是否类似于ART上的条件移动(组装)?,java,android,ternary-operator,android-runtime,Java,Android,Ternary Operator,Android Runtime,我想澄清一些关于Java中三元运算符的疑问 在Java中,它看起来像:x=(c?a:b)。根据我的阅读和经验,它似乎是作为一个分支if/else执行的,这意味着只对一条语句求值(a或b,但决不能同时求值)。我想知道这是否总是真的 在C语言中,它可能被编译成条件移动,它同时计算表达式a和表达式b 准确地说,我想知道Android代码是否也是如此。知道Java字节码在安装到具有最新操作系统的设备上时实际上会转换为本机指令(请参阅)。是否存在术后出现条件性移动的风险 让我们举个例子。包含以下内容的基本

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

在Java中,它看起来像:x=(c?a:b)。根据我的阅读和经验,它似乎是作为一个分支if/else执行的,这意味着只对一条语句求值(a或b,但决不能同时求值)。我想知道这是否总是真的

在C语言中,它可能被编译成条件移动,它同时计算表达式a和表达式b

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

让我们举个例子。包含以下内容的基本类:

//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分支来确保摆脱麻烦,但我仍然想知道……

根据

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

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

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

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

符合语言规范意味着只计算1个表达式