我们可以使用'?'运算符而不是嵌套 if 条件?

Can we use '?' operator instead of nested-if condition?

要使用 ? 编写的嵌套 if 条件: 句法。这不是允许的场景吗?

下面是代码

        int i=(10>5)?(2<5)?230:456;
        System.out.println("i="+i);

我认为等于

if(10>5){
   if(2<5){
        i=230;
   }
   else{
       i=456;
   }
}

我的想法是先对 10>5 进行评估,如果确实如此,它会验证 2<5 是否成立。现在因为这也是真的,所以 "i" 应该分配给 230。 错误消息是

ControlFlow.java:10: error: : expected
        int i=(10>5)?(2<5)?230:456;

ControlFlow.java:10: error: ';' expected
        int i=(10>5)?(2<5)?230:456;
                                   ^
ControlFlow.java:11: error: illegal start of expression
        System.out.println("i="+i);
              ^
ControlFlow.java:11: error: ';' expected
        System.out.println("i="+i);

您忘记添加表达式的一部分。尝试如下:

int i = (10>5) ? ( (2<5) ? 230:456 ) : 0; 

当您的第一个条件 (10>5) 为假时,将上面的 0 替换为您希望变量成为的所需数字。

三元运算符的语法为

aBoolean ? value : value

并且它将 return 本身作为一个值,因此您可以将它们嵌套为

aBoolean ? (aBoolean ? value : value) : value

您的代码 (10>5)?(2<5)?230:456; 然而等同于

aBoolean ? (aBoolean ? value : value)

所以它缺少第一个三元运算符的第二个值。

您可以选择以下解决方案。但今天不推荐这样做,因为源代码的认知复杂性在当今工业中是一个相当大的问题。根据您共享的逻辑,可以通过以下两种方式实现。

 int i=(10>5) && (2<5)?230:456;
    System.out.println("i="+i);


 int i = (10>5)?(2<5)?230:456:0;
    System.out.println("i="+i);

是的,您可以在 if 条件下尽可能深地嵌套三元运算符,但是,三元运算符是 IF 条件的压缩版本,如果您将它们压缩得更深,它们会使您的代码不可读。

请记住将条件括起来只是为了使其可读,但这不是要求 (0<1) ?

有时重新排列条件可能会更容易理解。

而不是

int v = (a > b) ? (c > d) ? 100 : 200 : 300;

你可以做到

int v = (a <= b) ? 300 : (c > d) ? 100 : 200;

唯一的区别是在后一种情况下,初始条件 returns 为真时立即取值,为假时需要进一步评估。