当前位置: 首页 > 知识库问答 >
问题:

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

罗祺
2023-03-14

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

在Java中,它看起来像:x=(c?a:b)。从我读到的和体验到的情况来看,它似乎是作为一个分支if/else执行的,这意味着只对一个语句求值(要么a要么b,但绝不会同时求值)。我想知道这是不是一直都是真的。

在C语言中,它可以被编译成条件移动,条件移动计算表达式a和B。

//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);
}

我知道我应该只使用if/else分支来确保摆脱困境,但我还是在想....

共有1个答案

蒲德曜
2023-03-14

根据Java语言规范,第15.25章

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

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

 类似资料:
  • 问题内容: C和许多其他语言具有条件(也称为三元)运算符。这使您可以根据条件的真实性在两个值之间进行非常简洁的选择,这使表达式(包括赋值)非常简洁。 我之所以错过了,是因为我发现我的代码有很多条件分配,在Python中需要四行代码: 而在C中它将是: 在文件中执行一两次是可以的,但是如果您有很多条件分配,则行数会爆炸,最糟糕的是吸引他们。 我喜欢条件运算符的简洁性,因为它使我认为略微的事情不会在浏

  • 问题内容: 前几天,我因三元运算符中意外的类型转换而遇到了一个非常奇怪的问题。鉴于此(无用的示例性)功能: 我期望编译后以下两个代码段完全相同: 与 。 事实证明,如果是,则-statement可以正常工作,而第二个代码段中的三元运算则抛出a 。似乎三元运算已决定将这两种选择都强制转换为类型,然后再将结果自动装箱为!?!。实际上,如果我将显式转换为,则该异常消失。换一种说法: 与以下内容不同: 。

  • 问题内容: 为什么此代码有效? 为什么这会引发异常? 但是最奇怪的是,该代码也可以成功运行,没有任何异常: 看来Java的三元运算符会改变行为。有人可以解释为什么吗? 问题答案: 该行为在JLS- 条件运算符中 指定: 如果第二和第三个操作数中的一个是原始类型T的,并且其他的类型是施加装箱转换(§5.1.7)到T的结果,则 条件表达式的类型为T 。 强调我的。因此,在第二种情况下: 由于第三个操作

  • 三元运算符 三元运算符 ? 应该只用在它能让代码更加清楚的地方。 一个条件语句的所有的变量应该是已经被求值了的。类似 if 语句,计算多个条件子句通常会让语句更加难以理解。或者可以把它们重构到实例变量里面。 推荐: result = a > b ? x : y; 不推荐: result = a > b ? x = c > d ? c : d : y; 当三元运算符的第二个参数(if 分支)返回和条

  • 问题内容: 如果使用三元运算符,则会出现nullpointer异常。 但是如果没有 谁能解释为什么? 谢谢苏达 问题答案: 您遇到的行为是由确定三元条件表达式的类型的规则导致的。 就您而言,表达式的类型 是。 这由JLS 15.25 指定。: 条件表达式的类型确定如下: 如果第二个操作数和第三个操作数具有相同的类型(可能为null类型),则这是条件表达式的类型。 如果第二和第三个操作数中的一个是原

  • 问题内容: 如果Python没有三元条件运算符,是否可以使用其他语言构造来模拟一个? 问题答案: 它是在2.5版中添加的。表达式语法为: 第一被评估,则恰好中的任一个a或b进行评估并返回基于所述布尔值。如果为,则被评估并返回但被忽略,否则被评估为返回但被忽略。 这允许发生短路,因为仅当评估为时才进行评估,而b根本不评估,而当为 评估时,仅当评估时就完全不评估。 例如: 注意条件是表达式,而不是语句