[英]Split single line if statement into multiline if statements
我试图将具有相同含义的单行if语句拆分为多行if语句。 我有:
if(a || (b && c))
{
/* do smt */
}
但想将其更改为类似
if(a && b && c)
{
/*do smt*/
}
具有相同的含义
if(a)
{
if(b)
{
if(c)
{
/* do smt */
}
}
}
谢谢!
布尔代数可以满足这一条件
|| (b && c)变成
(a || b)&&(a || c)
因此您可以执行以下操作:
if(a || b)
{
if(a || c){
/* do smt */
}
}
如果不重复if
块的主体,则无法真正做到这一点。 您可以转换a || b
a || b
到!(!a && !b)
,但是虽然它使用&&
,但是由于周围!(...)
原因,您无法将其拆分为嵌套的if
语句。
为什么首先要这样做? 我的假设是,三个条件a
, b
和c
都很长和/或很复杂。 如果是这种情况,我建议以下其中一项:
声明三个具有描述性名称的布尔变量,并在条件中使用它们
boolean isLoggedIn = // some really long data base lookup boolean isGuest = // more data base stuff boolean guestCanEdit = // a complex boolean expression if (isLoggedIn || (isGuest && guestCanEdit)) { ...
定义执行上述检查的三种方法,并在if
if (isLoggedIn(user) || (isGuest(user) && guestCanEdit(topic))) { ...
但是请注意,第一个版本不使用短路,即,即使第一个已经为真或第二个为假,也将评估所有条件。 如果任何条件在计算上昂贵,或者例如仅在第二次检查成功(例如在null
检查之后)时才可能进行第三次检查,则应避免这种情况。
关于您的评论 :条件
if (list.isEmpty() ||
(!list.isEmpty() && list.getLast().compareTo(heap.peek().value) <= 0))
是不是真的那么长,我不会建议任何的这个上面的方法,因为它不会得到更短的方式。 但是您可以缩短它,因为b
部分是多余的。 由于||
短路 , (b && c)
仅在!a
求值,并且由于您的b
为 !a
,您可以将其缩短a || c
a || c
if (list.isEmpty() || list.getLast().compareTo(heap.peek().value) <= 0)
如果您的目标是计算调用compareTo
次数,则可以使用以下代码:
if (! list.isEmpty() && list.getLast().compareTo(heap.peek().value) <= 0)
现在,这只是b && c
,用a
部分完全丢失。 请注意,这不等于a || (b && c)
a || (b && c)
了,但是在这种情况下,这很好,因为再次由于短路,实际上将不会在a || c
调用compareTo
。 a || c
如果a
已经评估为true
。
是的,您可以执行此操作,但也许不可以。
if (a && b) statement;
完全等同于
if (a){
if (b){
statement;
}
}
但是对于if (a || b)
则不能这样说:您需要编写statement;
在一个以上的地方:
if (a){
statement;
} else if (b){
statement;
}
就是说, ||
确实分布在&&
,即使具有短路特性:
所以
if (a || b && c/*redundant parentheses removed*/){
statement;
}
可以写成
if ((a || b) && (a || c)){
statement;
}
从上面是
if (a || b){
if (a || c){
statement;
}
}
尽管您不必要混淆,但这正是您想要的。
对此的需求不是很清楚,但是您可以执行以下操作:在函数中进行操作:
function codeToDo() {
// your code to execute on condition
}
if (a) {
codeToDo();
else if (b) {
if (c) {
codeToDo();
}
}
if(a || b)
{
if(a || c){
/* do smt */
}
}
要进一步处理if(a||b)
部分,请应用:
if(a){
/*do task1*/
}else if(b){
/*do task1*/
}
注意,在if(a)
和else if(b)
,您正在运行相同的代码;即task1。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.