我试图将单行if语句拆分为具有相同含义的multiline if语句。我有:
if(a || (b && c))
{
/* do smt */
}
但是想把它改成像我想要的那样
if(a && b && c)
{
/*do smt*/
}
具有与
相同的含义if(a)
{
if(b)
{
if(c)
{
/* do smt */
}
}
}
谢谢!
答案 0 :(得分:1)
布尔代数可以改变这种条件
a || (b&& c)进入
(a || b)&& (a || c)
所以你可以这样做:
if(a || b)
{
if(a || c){
/* do smt */
}
}
答案 1 :(得分:1)
如果不重复if
块的主体,就无法真正做到这一点。您可以将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
检查后),
关于你的comment:条件
if (list.isEmpty() ||
(!list.isEmpty() && list.getLast().compareTo(heap.peek().value) <= 0))
并不是 那么长,我不会为此提出任何上述方法,因为它不会那么短。但是可以缩短它,因为b
部分是多余的。由于||
的短路,(b && c)
仅在!a
时进行评估,并且由于您的b
是 !a
,您可以将其缩短为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)
,但在这种情况下,这是一件好事,因为再次因为短路,compareTo
实际上不会如果a || c
已经评估为a
,则会在true
中调用。
答案 2 :(得分:0)
是的,你可以这样做,但也许你不应该这样做。
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;
}
}
,从上面来看,是
{{1}}
虽然不必要地混淆了,但却是你想要的。
答案 3 :(得分:0)
对此的需求不是很清楚,但你可以这样做:在功能中实现:
function codeToDo() {
// your code to execute on condition
}
if (a) {
codeToDo();
else if (b) {
if (c) {
codeToDo();
}
}
答案 4 :(得分:0)
if(a||b)
要进一步处理if(a){
/*do task1*/
}else if(b){
/*do task1*/
}
部分,请申请:
if(a)
请注意,在else if(b)
以及<action name="mr-node">
<map-reduce>
<job-tracker>${jobTracker}</job-tracker>
<name-node>${nameNode}</name-node>
<configuration>
<property>
<name>oozie.mapreduce.uber.jar</name>
<value>${nameNode}/user/${wf:user()}/my-uber-jar.jar</value>
</property>
</configuration>
</map-reduce>
<ok to="end"/>
<error to="fail"/>
</action>
中,您运行相同的代码;即。任务1。