Java 多三元运算符
Posted
技术标签:
【中文标题】Java 多三元运算符【英文标题】:Java Multiple Ternary operators 【发布时间】:2014-04-04 18:18:02 【问题描述】:我目前正在学习一些 Java,我遇到了以下代码。我了解典型的三元运算符(例如下面以“boolean a”开头的行),但我不明白如何阅读以“boolean b”开头的行上的表达式。任何有关如何阅读此行的帮助将不胜感激!谢谢!
public class Ternary
public static void main (String[] args)
int x = 10;
int i = 2;
boolean a = x > 10 ? true: false;
boolean b = a = true ? ++i > 2 ? true:false:false;
System.out.print(b);
【问题讨论】:
查看运算符优先级的详细信息:docs.oracle.com/javase/tutorial/java/nutsandbolts/…。我对你有感觉——代码很深奥。 三元运算符具有以下格式(条件?条件为真时的结果:条件为假时的结果)。所以在这里,我们定义布尔值a,然后将它赋值给三元运算符的结果。 【参考方案1】:这样分解:
true ? (++i > 2 ? true
: false)
: false;
所以这里的测试条件总是设置为true
。所以执行的三元的分支是++i > 2 ? true : false
部分。
这只是检查增加后i
是否大于2
。如果是这样,它将返回true
。否则它将返回false
。
整个表达式实际上是不必要的复杂。可以简单地写成这样:
boolean b = a = (++ i > 2);
但是,代码可能在逻辑上不正确,因为这个深奥的表达没有那么大的意义。由于上一行设置了a
的值,我假设下一行实际上打算测试a
。所以实际意图可能是:
boolean b = a == true ? ++i > 2 ? true : false : false; //notice the ==
在这种情况下,您可以将其分解为:
(a == true) ? (++i > 2 ? true
: false)
: false;
但是您实际上不需要执行a == true
,因为a
已经是boolean
,所以您可以这样做:
a ? (++i > 2 ? true
: false)
: false;
在这里,它检查a
是否为true
。如果是,则执行我们已经检查过的检查(即查看i
的增量值是否大于2
),否则返回false
。
但即使是这个复杂的表达式也可以简化为:
boolean b = a && (++i > 2);
【讨论】:
最后一个假的呢?它会做一个真值表 T v F = T 吗? 最后一个false
在这种情况下永远不会被评估,因为测试总是true
。
感谢您的解释 Vivin(以及其他所有人)。该代码实际上来自一个示例 OCJA 考试,这可能解释了为什么它写得如此不必要的复杂。再次感谢!
大声笑,现在我在已删除的问题上得到了 -3,因为我是第一个提到 b = a = true
的人不正确。并在 Rohit Jain 的回答下方查看您的评论..
@Zefnus 我的意思是“正确”,因为代码会编译。但是,是的,这真的没有意义。【参考方案2】:
在boolean b = a = true ? ++i > 2 ? true:false:false;
中发生以下情况:
a = true
这将赋予a
true
值并评估为true
。
然后我们从++i > 2 ? true:false
得到另一个条件++i > 2
,在这种情况下也是如此。结果将是true
。
【讨论】:
【参考方案3】:啊!永远不要写那样的代码。但我会假设这不是你写的。但你可以这样读:
// I assume that's `a == true` instead of `a = true`
boolean b = a == true ? (++i > 2 ? true : false)
: false;
可以进一步分解为:
// a == true is better written as just `a`. You shouldn't do boolean comparison
// like that.
boolean b = a ? (++i > 2) : false;
// If that is really a = true, then you can break it as:
boolean b = a = true ? (++i > 2) : false;
可以进一步细分为:
// If that is `a == true`
boolean b = a && (++i > 2)
// If that is really a = true, then you can break it as:
boolean b = a = (++i > 2);
还有,第一个作业:
boolean a = x > 10 ? true: false;
也可以写成:
boolean a = x > 10;
【讨论】:
我不认为这是正确的。boolean b = a = true
是正确的;它只是将结果分配给a
和b
。
a == true 不太好,但它不会将 true 分配给 a。
仅供参考,IntelliJ 将其简化为 boolean b = a = ++i > 2;
。
@VivinPaliath 更新了该案例的答案,但我怀疑这确实是这个意思。在那种情况下,那将是奇怪的代码。
@GáborBakos 我知道a == true
不太好。请查看我的更新答案。【参考方案4】:
三元运算符
条件判断为真或假
条件始终为真(因为 a 等于真)。
那么结果为真,因为 ++i 大于 2(它是 3)。
因此,它将 true 分配给 b
。如果条件为假,它将分配为假。该 false 将从最后一个 false 分配。
【讨论】:
【参考方案5】:如果您可以使用 括号 并按如下方式查看该代码,将会有所帮助;
boolean b = a = (true ? (++i > 2 ? true : false) : false);
你可以这样想:
if (true) // # If Number:1
if (++i > 2) // # If Number:2
a = true;
else a = false;
else a = false;
其中if(true)
是Tautology 并且If Number:2 将始终被执行。所以;它变成了;
if (++i > 2)
a = true;
else a = false;
可以评估为; a = (++i > 2) ? true : false);
变成:a = ++i > 2
结果 b = a
就是 ++i > 2
。
【讨论】:
【参考方案6】:可怕的代码!
有一些线索表明b = a = true ? ...
应该是b = a == true ? ...
,否则前一行是一个无用的赋值(a 永远不会被读取),并且该行的最后一个false
成为无法访问的代码。编译器会告诉你的。
我会假设一个更正的==
来回答 - 但你会知道这是你的错字、不可靠的来源还是“发现错误”测试,并且能够使用相同的任何你喜欢的代码的技术。
诀窍是逐步重构它。首先根据优先规则添加括号和缩进。
b = a == true ? ++i > 2 ? true:false:false;
... becomes ...
b = (a == true)
? (++i > 2 ? true:false)
:false;
接下来注意:
a == true
等同于 a
。
boolean x = a ? true : false;
等价于 boolean x = a
。
因此:
b = a
? (++i > 2)
:false;
或:
b = a && ( ++i > 2 );
如果这是“严重”代码,解决此问题的方法是编写一组涵盖所有可能输入情况的单元测试。然后一次一个地进行这些重构,每次都重新运行测试以确保您没有改变代码的行为。
请注意,简化形式中没有 true
或 false
文字。在三元运算中看到布尔文字——或者实际上是布尔值的三元表达式——是一种代码味道,因为非三元版本通常更简单、更清晰。
三元表达式对其预期目的非常有用,即将布尔条件映射到非布尔输出:
shippingPrice = orderTotal >= freeShippingThreshold ? 0 : getStandardShipping();
【讨论】:
【参考方案7】:对正在尝试的内容进行了一些猜测,并对变量进行了一些重命名,并假设 a = true
应该是 a == true
,你会得到:
boolean failed = result > 10 ? true: false;
boolean b = failed ? ++retries > 2 ? true:false:false;
然后可以将其整理成更合乎逻辑的:
boolean failed = result > 10;
boolean giveUp = failed && ++retries > 2;
【讨论】:
【参考方案8】:boolean nu = f=='f' && t=='f'; //0
boolean ei = f=='f' && t=='t'; //1
boolean zw = f=='t' && t=='f'; //2
boolean dr = f=='t' && t=='t'; //3
System.out.println( nu ? 0 : ei ? 1 : zw ? 2 : dr ? 3 : "invalid");
【讨论】:
以上是关于Java 多三元运算符的主要内容,如果未能解决你的问题,请参考以下文章