我在运行我的函数时遇到问题。该程序应该只在 200 到 800 之间查看一组 3 个数字是否有效。即使 -5 等值无效,结果仍然说它有效。有人可以帮我找出问题吗?
user2901718
问问题
38 次
2 回答
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
如果这些位置恰好已被您的程序在先前的函数调用中使用,则它们可能具有非零值,导致它们评估为“真”。
您需要将这些默认设置为 false:
bool ansa = false, ansb = false, ansc = false, overall = 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)
“&&”的意思是“AND ALSO”,所以如果a
为假,则条件不能为真,所以没有理由继续找出是否b
和c
也为真。
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;
}
于 2013-10-30T05:54:33.913 回答
1
你还没有初始化 ansa、ansb 或 ansc。您在条件语句中明确地将它们设置为 true,但您从未将它们设置为 false。因此,它们的值没有定义,只要它们没有被初始化为零,它们就会被认为是真的。
于 2013-10-30T05:55:03.147 回答