条件三元运算符

3

首先,最近我遇到了这个问题,但一直没有找到一个好的解释:

int x = (30 > 15)?(14 > 4) ? 1 : 0 : 2; 

我之前使用过三元表达式,所以对它们很熟悉。老实说,我甚至不知道该如何称呼这个表达式......我认为它可以这样分解:

if (con1) or (con2) return 1         // if one is correct     
if (!con1) and (!con2) return 0      // if none are correct     
if (con1) not (con2) return 2        // if one but not the other

就像我说的一样,我并不是很确定,所以我的猜测可能相差甚远。


我选择了Ted Hopp的答案,因为它提供了更清晰的解释。谢谢,但是为了明确起见,这被称为嵌套三元条件吗? - CDVN
我不认为这种结构有具体的标准名称,但是,“嵌套三元运算符”或类似的语言对大多数人来说应该是清晰的。其想法是三元运算符的结构 -“<条件>?<表达式1>:<表达式2>”- 允许在“?”或“:”之后包括任何表达式,包括其他三元运算符表达式。 - Ted Hopp
2个回答

4

It's int x = (30 > 15)?((14 > 4) ? 1 : 0): 2; :

if (30 > 15) {
    if (14 > 4) 
        x = 1;
    else 
        x = 0;
} else {
    x = 2;
}

4
由于Java中的运算符优先级(操作符优先级),因此该代码为:
int x = (30 > 15)?(14 > 4) ? 1 : 0 : 2;

将被解析为以下括号内的内容:

int x = (30 > 15) ? ((14 > 4) ? 1 : 0) : 2;

(与三元运算符?:优先级相比,唯一优先级较低的运算符是各种赋值运算符:=+=等。)您的代码可以用语言表达为:
  • 如果(con1)和(con2),则将1分配给x
  • 如果(con1)和(非con2),则将0分配给x
  • 否则将2分配给x

编辑:嵌套的三元运算符通常以特殊的方式格式化,以使整个过程更易于阅读,特别是当它们超过两层时:

int x = condition_1 ? value_1     :
        condition_2 ? value_2     :
          .
          .
          .
        condition_n ? value_n     :
                      defaultValue; // for when all conditions are false

如果您想在其中一个'?'部分使用三元表达式,那么这种方法可能不太干净。通常会反转条件的意义以保持':'部分的嵌套,但有时需要在两个分支中进行嵌套。因此,您的示例声明可以重写为:

int x = (30 <= 15) ? 2 :
        (14 > 4)   ? 1 :
                     0 ;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接