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

时间:2012-07-30 21:22:02

标签: c++ if-statement boolean-logic

以下是我遇到问题的一段代码的极简化版本。

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)”括号内的语句,即使count永远不会递增。

5 个答案:

答案 0 :(得分:5)

你犯了一个共同(而且非常令人沮丧)的错误:

if (crossRes = true) {

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

if (crossRes == true) {

或者更简洁:

if (crossRes) {

答案 1 :(得分:2)

我的立场得到了纠正:

if (crossRes)
<德尔> 如果你的病情好的话,你不会有这个问题     if(true = crossRes) 因为它不会编译。 `crossRes = true`总是求值为'true`,因为它是一个赋值,为'true`。 你想要`crossRes == true`:     if(crossRes == true){         printf(“如果dif总是&gt; Tol,那么这个循环中什么都不会发生                因为在这种情况下,计数永远不会增加,对吧?“);     }

答案 2 :(得分:1)

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

if (crossRes == true) {

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

if (doNext = true) { // Bad code

答案 3 :(得分:1)

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

 true == crossRes

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

 true = crossRes

不会编译。

答案 4 :(得分:1)

首先,虽然很多人都指出了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)首选。但是当你开始使用布尔值时,只需使用它;不做比较以产生另一个相同的。