可能由if语句引起的C++布尔逻辑错误
C++ boolean logic error possibly caused by if statements
这是我遇到问题的一段代码的一个极其简化的版本。
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
。您希望将crossRes
与true
进行比较,这意味着您需要另一个等号:
if (crossRes == true) {
或者更简洁地说:
if (crossRes) {
我已更正:
if (crossRes)
=
是赋值,==
是相等比较。您想要:
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)首选。但是,当您从布尔值开始时,只需使用它;不要通过比较来产生另一个相同的结果。
- 一个关于在C++中重载布尔运算符的问题
- 提升精神:解析布尔表达式并简化为规范范式
- 在没有定义返回类型的函数中返回布尔值,并将结果保存在无错误的char编译中-为什么
- 线程之间的布尔停止信号
- 布尔比较运算符是如何在C++中工作的
- 变量定义到C++布尔值转换
- 如何确保在使用基于布尔值的两个方法之一调用方法时避免分支预测错误
- 隐式常量/非常量运算符布尔
- 如何编写一个使用n倍三元条件语句的C++布尔函数
- 如何在 c++ 中让布尔变量返回为 0 或 1 而不是真或假?
- 重载更少,则运算符返回相反的布尔值
- 将布尔变量添加到 int
- 为什么布尔开关语句有编译器警告?
- 将此布尔值传递给此函数的最有效方法是什么?
- 如何使布尔变量仅在设置为 true 时才为真?
- 为什么我不能在返回 const 的布尔函数中为类成员变量赋值?C++
- 程序中的布尔函数返回输入的范围无论如何都是无效的
- 当我尝试通过 arduino 上的引用传递布尔数组时出现问题
- 如何设置 c++ 类的布尔值?
- 使用 MAKEWORD / MAKEWPARAM 使用布尔值而不是布尔值