Java 中的三元表达式如何求值?
How are ternary expressions in Java evaluated?
我已按照教程提供 here 并符合:
boolean t1 = false?false:true?false:true?false:true;
t1 的最终值为 false。但我评价它是真的。
第一个 false 给出 true,那个 true 给出 false,最后给出 true
我对吗?不,我错了。
请告诉我如何在 java?
中评估三元表达式
当编译器找到 ?
字符时,它会查找对应的 :
。 ?
前的表达式是三元条件运算符的第一个操作数,表示条件
?
和:
之间的表达式是运算符的第二个操作数,如果条件为真则返回其值。
:
后面的表达式是运算符的第三个操作数,如果条件为假则返回其值。
boolean t1 = false ? false : true?false:true?false:true;
first second third
operand operand operand
由于第一个操作数为假,结果是第三个操作数的值true?false:true?false:true
,所以我们来计算一下:
true ? false : true?false:true;
first second third
operand operand operand
由于第一个操作数为真,结果为第二个操作数的值 - false
.
顺便说一句,第三个操作数 true?false:true
的值也是 false
,所以 x?false:true?false:true
returns false 不管 x
的值如何。
我们可以根据结合性规则对这些操作进行重组。
boolean t1 = (false ? false : (true ? false : (true ? false : true)));
| | |
| | 1
| 2
3
理论上,这是应该发生的事情
- Exp 1 首先求值,求值为
false
。
- Exp 2 现在是:
true? false : false
所以最终输出是 false
。
- Exp 3 现在变为
false ? false : false
,即 false
。
现在,为了获得技术性,这就是实际发生的事情:
- Exp 3 is
false ? (don't care) : (...)
-> 需要计算包含 Exp 2 和 Exp 1 的内部表达式。
- Exp 2 是
true: false, (don't care)
由于我们已经确定了 Exp 2 的值,因此不再需要计算 Exp 1。
- Exp 3 现在重新计算为
false ? (don't care) : false
,因此最终答案是 false
。
下面的伪代码显示了如何计算表达式:
boolean t1 = false?false:true?false:true?false:true
= true && (true ? false : true ? false : true)
= true && false
= false
另一种看待它的方式:
boolean t1 = false?false:true?false:true?false:true;
可以简化为:
boolean t1 = !false && (true ? false : true ? false : true);
然后简化为:
boolean t1 = true && (true ? false : true ? false : true);
然后简化为:
boolean t1 = true && false;
最终导致 false
;
我已按照教程提供 here 并符合:
boolean t1 = false?false:true?false:true?false:true;
t1 的最终值为 false。但我评价它是真的。 第一个 false 给出 true,那个 true 给出 false,最后给出 true 我对吗?不,我错了。 请告诉我如何在 java?
中评估三元表达式当编译器找到 ?
字符时,它会查找对应的 :
。 ?
前的表达式是三元条件运算符的第一个操作数,表示条件
?
和:
之间的表达式是运算符的第二个操作数,如果条件为真则返回其值。
:
后面的表达式是运算符的第三个操作数,如果条件为假则返回其值。
boolean t1 = false ? false : true?false:true?false:true;
first second third
operand operand operand
由于第一个操作数为假,结果是第三个操作数的值true?false:true?false:true
,所以我们来计算一下:
true ? false : true?false:true;
first second third
operand operand operand
由于第一个操作数为真,结果为第二个操作数的值 - false
.
顺便说一句,第三个操作数 true?false:true
的值也是 false
,所以 x?false:true?false:true
returns false 不管 x
的值如何。
我们可以根据结合性规则对这些操作进行重组。
boolean t1 = (false ? false : (true ? false : (true ? false : true)));
| | |
| | 1
| 2
3
理论上,这是应该发生的事情
- Exp 1 首先求值,求值为
false
。 - Exp 2 现在是:
true? false : false
所以最终输出是false
。 - Exp 3 现在变为
false ? false : false
,即false
。
现在,为了获得技术性,这就是实际发生的事情:
- Exp 3 is
false ? (don't care) : (...)
-> 需要计算包含 Exp 2 和 Exp 1 的内部表达式。 - Exp 2 是
true: false, (don't care)
由于我们已经确定了 Exp 2 的值,因此不再需要计算 Exp 1。 - Exp 3 现在重新计算为
false ? (don't care) : false
,因此最终答案是false
。
下面的伪代码显示了如何计算表达式:
boolean t1 = false?false:true?false:true?false:true
= true && (true ? false : true ? false : true)
= true && false
= false
另一种看待它的方式:
boolean t1 = false?false:true?false:true?false:true;
可以简化为:
boolean t1 = !false && (true ? false : true ? false : true);
然后简化为:
boolean t1 = true && (true ? false : true ? false : true);
然后简化为:
boolean t1 = true && false;
最终导致 false
;