-1

我在运行我的函数时遇到问题。该程序应该只在 200 到 800 之间查看一组 3 个数字是否有效。即使 -5 等值无效,结果仍然说它有效。有人可以帮我找出问题吗?

4

2 回答 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为假,则条件不能为真,所以没有理由继续找出是否bc也为真。

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 回答