可能由if语句引起的C++布尔逻辑错误

C++ boolean logic error possibly caused by if statements

本文关键字:C++ 布尔逻 错误 if 语句      更新时间:2023-10-16

这是我遇到问题的一段代码的一个极其简化的版本。

int i = 0;
int count = 0;
int time = 50;
int steps = 1000;
double Tol = 0.1;
bool crossRes = false;
bool doNext = true;
for (int i=0; i<steps; i++) {
//a lot of operations are done here, I will leave out the details, the only
//important things are that "dif" is calculated each time and doNext either
//stays true or is switched to false
    if (doNext = true) {
        if (dif <= Tol) count++;
        if (count >= time) {
            i = steps+1;
            crossRes = true;
        }
    }
}
    if (crossRes = true) {
        printf("Nothing in this loop should happen if dif is always > Tol 
               because count should never increment in that case, right?");
    }

我的问题是,每次完成for循环时,即使计数从未增加,它也会执行"if(crossRes=true)"括号内的语句。

您犯了一个常见的(非常令人沮丧的)错误:

if (crossRes = true) {

此行将crossRes分配给true,并返回true。您希望crossRestrue进行比较,这意味着您需要另一个等号:

if (crossRes == true) {

或者更简洁地说:

if (crossRes) {

我已更正:

if (crossRes)
如果你的情况是if(true=crossRes)因为它无法编译。`crossRes=true`总是计算为'true',因为这是一个赋值,为'trup'。您想要`crossRes==true`:if(crossRes==true){printf("如果dif始终>Tol,则此循环中不会发生任何事情因为在这种情况下,计数永远不应该增加,对吧?");}

=是赋值,==是相等比较。您想要:

if (crossRes == true) {

你在这里犯了同样的错误:

if (doNext = true) { // Bad code

这里的其他答案已经告诉了您这个问题。你的编译器经常会警告你,但确保你不这样做的一种方法是把常量项放在左边的上

 true == crossRes

这样你就会得到一个编译器错误,而不是警告,所以它不会在之后被忽视

 true = crossRes

不会编译。

首先,尽管许多人指出了if (crossRes = true)的问题,但出于某种原因,他们(无论如何)还没有指出if (doNext = true)的相同问题。

我将坚持指出,您真正想要的是if (crossRes),而不是if (crossRes == true)(甚至是if (true == crossRes))。

第一个原因是它避免了由于简单的拼写错误而遇到同样的问题。

第二个是比较的结果是bool——所以如果if (crossRes==true)是必要的,你可能需要if (((((crossRes == true) == true) == true) == true)来确定(也许还有几个——你永远不会知道)。当然,这完全是愚蠢的——你从bool开始,所以你不需要比较就能得到bool

我还要注意的是,如果你坚持要进行比较,你几乎应该总是使用if (x != false)而不是if (x == true)。虽然它在C++中并不真正适用,但在没有实际布尔类型的旧C中,可以使用任何整数类型——但在这种情况下,与true进行比较可能会给出不正确的结果。至少在正常情况下,false将为0,true将为1——但在测试时,任何非零值都将被视为等效于true。例如:

int x = 10;
if (x)    // taken
if (x == true) // not taken, but should be.

如果您不是像这里那样从布尔值开始,那么if (<constant> <comparison> <variable>)是有意义的,并且是(IMO)首选。但是,当您从布尔值开始时,只需使用它;不要通过比较来产生另一个相同的结果。