我们可以使用'?'运算符而不是嵌套 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 为真时立即取值,为假时需要进一步评估。
要使用 ? 编写的嵌套 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 为真时立即取值,为假时需要进一步评估。