【问题标题】:Turning logical expression around翻转逻辑表达式
【发布时间】:2013-11-10 08:46:30
【问题描述】:

我有以下代码:

bool s = true;

for (...; ...; ...) {
    // code that defines A, B, C, D 
    // and w, x, y, z

    if (!(A < w) && s == true) {
        s = false;
    }

    if (!(B < x) && s == true) {
        s = false;
    }

    if (!(C < y) && s == true) {
        s = false;
    }

    if (!(D < z) && s == true) {
        s = false;
    }
}

这段代码运行良好。但是,出于几个(不重要的)原因,我想更改代码,以便我可以启动 s = false; 并在 if 语句中将其设置为 true。它尝试了以下方法:

bool s = false;

for (...; ...; ...) {
    // code that defines A, B, C, D 
    // and w, x, y, z

    if (A >= w && s == false) {
        s = true;
    }

    if (B >= x && s == false) {
        s = true;
    }

    if (C >= y && s == false) {
        s = true;
    }

    if (D >= z && s == false) {
        s = true;
    }
}

但是,由于上面的代码正在运行,因此无法正常运行。我知道在逻辑的某个地方想错了,但我不知道在哪里。有没有人看到我可能明显的错误?

编辑:添加了另外三个 if 语句。自从他们被评论后就错过了他们。

【问题讨论】:

  • 注意A &amp;&amp; B的否定不是 !A &amp;&amp; !B,而是!A || !B)
  • @thriqon 但是他还不如把 s 设置为 true,因为它总是会进入 if。
  • 改变条件(A
  • 请显示更多信息,可能是您的整个 for 循环或结果有何不同以及您的期望。
  • 你需要查阅德摩根定律。

标签: c++ if-statement logic


【解决方案1】:

De Morgan's laws 说,您还应该将&amp;&amp; 更改为||

【讨论】:

  • 如果在第一个循环中,它将始终输入。
【解决方案2】:

!(A &lt; x)A &gt;= x 相同,因此您的函数根本没有反转逻辑。您需要使用A &lt; x

我可能不会在循环中检查s 的当前状态。要么你翻转它,要么你不翻转它。除非有某些理由继续循环,否则我可能会在翻转 s 后选择 break

【讨论】:

    【解决方案3】:

    我在Wikipedias page on De Morgan's laws 上找到了答案。我的问题的正确代码是:

    bool s = false;
    
    for (...; ...; ...) {
        // code that defines A, B, C, D 
        // and w, x, y, z
    
        if (!(A >= w || s == false)) {
            s = true;
        }
    
        if (!(B >= x || s == false)) {
            s = true;
        }
    
        if (!(C >= y || s == false)) {
            s = true;
        }
    
        if (!(D >= z || s == false)) {
            s = true;
        }
    }
    

    感谢@EJP 的提示!

    【讨论】:

    • s == false 始终为真,因此!(A &gt;= w || s == false) 始终为假,s = true; 永远不会被执行,除非 s 已经为真。
    【解决方案4】:

    设置s的循环体部分在逻辑上等价于:

    if(A >= w || B >= x || C >= y || D >= z)
        s = false;
    

    其中,抽象条件,等价于:

    s &= some_function(A, B, C, D, w, x, y, z);
    

    你想把它改成这样:

    s |= some_other_function(A, B, C, D, w, x, y, z);
    

    在第一种情况下,如果 some_function 在循环的每次迭代中返回 false,则 s 在循环之后为 true。在第二个 true 中,如果 some_other_function 在循环的任何次迭代中返回 true,则 s 在循环之后为 true。

    some_other_function 只能在 some_function 在任何迭代中返回 true 时才能返回 true。但是some_other_function 只能访问当前迭代中的值。因此不能存在有效的some_other_function

    这是假设s 在两种情况下循环后必须具有相同的值。否则,您可以在与s 相关的所有位置中轻松交换truefalse

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-27
      • 2020-11-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多