以下是我遇到问题的一段代码的极简化版本。
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永远不会递增。
答案 0 :(得分:5)
你犯了一个共同(而且非常令人沮丧)的错误:
if (crossRes = true) {
此行将crossRes
分配给true
并返回true
。您希望将 crossRes
与true
进行比较,这意味着您需要另一个等号:
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)首选。但是当你开始使用布尔值时,只需使用它;不做比较以产生另一个相同的。