我遇到运行我的功能的问题。该程序应该看看一组3个数字是否有效,只要它在200到800之间。即使认为诸如-5的值无效,结果仍然说它有效。有人可以帮我识别问题吗?
答案 0 :(得分:2)
您正在遇到未定义的行为,因为您没有初始化bool变量。
bool ansa, ansb, ansc, overall;
在C和C ++中,当一个表达式求值为0时,它被认为是“假”,否则它被认为是真的。
if (!0)
std::cout << "!0 is true" << std::endl;
if (3)
std::cout << "3 is true" << std::endl;
if (255)
std::cout << "255 is true" << std::endl;
正在发生的事情是该程序正在为堆栈上的ansa
,ansb
和ansc
分配空间。如果这些位置碰巧已被您的程序在之前的函数调用中使用过,那么它们可能具有非零值,导致它们评估为“true”。
默认情况下,您需要将它们设置为false:
bool ansa = false, ansb = false, ansc = false, overall = false;
或者当你发现他们的条件不符合时,你需要为他们赋值“false”(测试的“其他”情况):
bool isitavalidgroup (int a, int b, int c)
{
bool ansa, ansb, ansc, overall;
if ((a <= 800) && (a >= 200)){
ansa = true;
}
else {
cout << a << " is invalid" << endl;
ansa = false;
}
if ((b <= 800) && (b >= 200)) {
ansb = true;
}
else {
cout << b << " is invalid" << endl;
ansb = false;
}
if ((c <= 800) && (c >= 200)) {
ansc = true;
}
else {
cout << c << " is invalid" << endl;
ansc = false;
}
if (ansa && ansb && ansc == true){
overall = true;
}
else {
overall = false;
}
return overall;
}
此外,您可以重写代码以使用“短路”逻辑 - 也就是说,为了使组有效,所有三个变量必须有效。如果任何一个无效,您立即知道该组不再有效。因此,当您找到第一个错误条件而不是继续测试所有错误条件时返回false。
if (a && b && c)
“&amp;&amp;”表示“AND ALSO”,因此如果a
为false,则条件不可能为真,因此没有理由继续判断b
和c
是否也为真。< / p>
bool isItAValidGroup(int a, int b, int c)
{
if (a < 200 || a > 800) {
cout << a << " is invalid" << endl;
return false;
}
if (b < 200 || b > 800) {
cout << b << " is invalid" << endl;
return false;
}
if (c < 200 || c > 800) {
cout << c << " is invalid" << endl;
return false;
}
// everything passed.
return true;
}
答案 1 :(得分:1)
您尚未初始化ansa,ansb或ansc。您在条件语句中明确地将它们设置为true,但是您从未将它们设置为false。因此,它们的值没有定义,只要它们不会被初始化为零,就会被认为是真实的。