0

我有以下代码:

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 语句。错过了他们,因为他们被评论了。

4

4 回答 4

2

德摩根定律说,你也应该&&改成||.

于 2013-11-10T08:48:21.180 回答
0

我在德摩根定律的维基百科页面上找到了答案 。我的问题的正确代码是:

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 的提示!

于 2013-11-10T09:21:23.217 回答
0

设置的循环体部分在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);

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

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

这是假设s在两种情况下循环后必须具有相同的值。否则,您可以truefalse所有与s.

于 2013-11-10T12:04:03.627 回答
0

!(A < x)是一样的,A >= x所以你的函数根本没有颠倒逻辑。你需要使用A < x.

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

于 2013-11-10T08:53:43.857 回答