这组条件可以进一步简化吗?

时间:2013-03-18 17:46:39

标签: c math logic

我开始使用这套条件:

if (old.tg.all && old.hg.all) {
    // reject
} 

if (new.tg.all && new.hg.all) {
    // reject
}

if (old.hg.all && new.tg.all) {
    // reject
}

if (old.tg.all && new.hg.all) {
    // reject
}

if (old.tg == new.tg) {
    if  ( (old.hg == new.hg) || (old.hg.all) || (new.hg.all) ) {
        // reject
    }
}

if (old.hg == new.hg) {
    if ( (old.tg == new.tg) || (old.tg.all) || (new.tg.all) ) {
        // reject
    }
}

我设法将其减少为:

if (old.tg.all || new.tg.all) && (old.hg.all || new.hg.all) {
    // reject
}

if (old.tg == new.tg) {
    if  ( (old.hg == new.hg) || (old.hg.all) || (new.hg.all) ) {
        // reject
    }
}

if (old.hg == new.hg) {
    if ( (old.tg == new.tg) || (old.tg.all) || (new.tg.all) ) {
        // reject
    }
}

可以进一步减少逻辑运算的数量和/或布尔条件的重复次数吗?

1 个答案:

答案 0 :(得分:1)

关于逻辑表达式简化的原始问题

首先,“表达式简化”不是一个定义明确的操作。

其次, a (或多或少)对简化逻辑表达式的标准理解是Disjunctive normal form(或者,它的兄弟Conjunctive normal form)。两者都可能比原始表达式和简化表达式更简单。

至少,他们最小化表达式的深度

关于C代码的完全重写的问题

主要问题是简单,但清晰意图与可维护性。您不应该担心您编写的字符数或代码行数,而应该关注理解和修改代码逻辑的难度。只要代码清楚,一点冗余和/或额外(便宜)检查就不会受到伤害。