我有以下代码:
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;
}
}
但是,由于上面的代码正常工作,因此无法正常工作。我知道在逻辑中某处想错了,但我无法弄清楚在哪里。 anbyone会看到我可能明显的错误吗?
编辑:增加了三个if-statemets。错过了他们,因为他们被评论了。
答案 0 :(得分:2)
De Morgan's laws说,您还应该将&&
更改为||
。
答案 1 :(得分:0)
!(A < x)
与A >= x
相同,因此您的功能根本没有颠倒逻辑。您需要使用A < x
。
我可能不会在循环中检查s
的当前状态。无论是你翻转还是不翻。除非有理由继续循环,否则在翻转break
之后我可能会s
。
答案 2 :(得分:0)
我在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提示!
答案 3 :(得分: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
在循环的每次迭代中返回false,则循环后some_function
为真。如果s
在循环的任何迭代中返回true,则在循环之后some_other_function
为真。
some_other_function
在任何迭代中都返回true,则 some_function
只能返回true。但是some_other_function
只能访问当前迭代中的值。因此,有效的some_other_function
不能存在。
假设s
在两种情况下循环后必须具有相同的值。否则,您可以在与true
相关的所有地方轻松交换false
和s
。