0

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

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 从未增加。

4

5 回答 5

5

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

if (crossRes = true) {

此行分配crossRestrue并返回true。您正在寻找与进行比较 crossRestrue这意味着您需要另一个等号:

if (crossRes == true) {

或更简洁地说:

if (crossRes) {
于 2012-07-30T21:24:48.213 回答
2

我纠正了:

if (crossRes)
如果您的条件是 if (true = crossRes),您就不会遇到这个问题,因为它不会编译。`crossRes = true` 总是评估为 `true`,因为它是对 `true` 的赋值。你想要 `crossRes == true`: if (crossRes == true) { printf("如果 dif 总是 > Tol,那么这个循环中不会发生任何事情,因为在这种情况下 count 永远不应该增加,对吧?"); }
于 2012-07-30T21:23:33.953 回答
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)只需要确定(也许更多——你永远不知道)。当然,这完全是愚蠢的——你从 a 开始bool,所以你不需要比较就可以得到 a bool

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

int x = 10;

if (x)    // taken

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

如果您不是从这里的布尔值开始,那么这if (<constant> <comparison> <variable>) 是有道理的并且是(IMO)首选。但是,无论如何,当您从布尔值开始时,只需使用它;不要进行比较来产生另一个相同的。

于 2012-07-30T21:33:20.797 回答
1

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

 true == crossRes

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

 true = crossRes

不会编译。

于 2012-07-30T21:27:38.557 回答
1

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

if (crossRes == true) {

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

if (doNext = true) { // Bad code
于 2012-07-30T21:23:46.410 回答