文章大纲

if里有and或or条件表达式,如何推断出else的条件表达式

2020-06-11 23:32:46

写程序时,if语句随处可见。


有时,我们写if语句时,只知道在A条件下要做B动作,不然就做C动作。我们会如下写:

if( A ){
  do B;
}else{
  do C;
}

此种情况,我们并无需思考else对应的条件逻辑是什么。


当A条件很简单时,例如就一个表达式时,例如判断一个变量是否等于某个值:$a == 3,这种情况只要大脑没进水,就知道else走的是$a变量不等于3的逻辑。


但本文翟码农要分享的是,当A条件很复杂时,在else里要继续做if判断(即涉及到嵌套if了),该如何理清else对应的逻辑。


例如,当A条件为(Ea  && Eb )  ||  Ec )时, 该如何确定else对应的逻辑?这里Ea,Eb,Ec代表3个判断条件。


有时候头脑清醒,你可能还能想清楚。但疲累异常时,你很可能就实在想不清楚,到底哪些情况,会走else语句块。


方法就是:利用集合思想。


上面的(Ea  && Eb )  ||  Ec )条件表达式,我们可以转为(Ea ∩ Eb) U Ec这样的集合表达式。如此一来,else走的逻辑就是:^(  (Ea ∩ Eb) U Ec  )。


集合求反的顶部上划线不会弄,暂时我就用求反符号表示啦


接下来要做的工作,就是将^(  (Ea ∩ Eb) U Ec  )这个条件表达式展开了,这就涉及到集合的德摩根律啦。(关于德摩根律公式可见本文末尾的图片)


展开过程:

1. 先将Ea ∩ Eb看成一个整体Ed,即^(  Ed U Ec  ),展开就是^Ed ∩ ^Ec.

2.再将^Ed部分展开,^(Ea ∩ Eb ),展开就是^Ea U ^Eb.

3.最终结果就是( ^Ea U ^Eb) ∩ ^Ec。


将最终结果再转换成php表达式,就是 (!Ea || !Eb) && !Ec了。


随便举个php例子,仅供参考:

if( ( !empty($flag) && in_array($id, [10,12,14,18]) ) || 1 !== $value ){
    $status = 0;
}else{
    ...
}

如果要在else里语句块还要继续判断,就必须先把else对应的条件理清。


根据上面“展开过程”的分析,可知else走的逻辑是:

( empty($flag) || ! in_array($id, [10,12,14,18]) ) && 1 == $value


然后else里的逻辑,你就可以根据需求继续if判断,例如:

$status = 1;
if( empty($flag) ){
  $status = 2;
}

if( $id > 0 && $id < 9){
  $status = 3
}


集合的德摩根律:

 德摩根律




本文为翟码农个人博客蓝翟红尘里有关if语句和集合相关联分析的原创文章,转载请注明出处:http://www.zhai14.com/blog/how-to-get-the-expression-of-else-according-to-the-if-condition.html




我要评论
评论列表