获取功能错误消息

时间:2013-10-30 05:45:41

标签: c++

我遇到运行我的功能的问题。该程序应该看看一组3个数字是否有效,只要它在200到800之间。即使认为诸如-5的值无效,结果仍然说它有效。有人可以帮我识别问题吗?

2 个答案:

答案 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;

正在发生的事情是该程序正在为堆栈上的ansaansbansc分配空间。如果这些位置碰巧已被您的程序在之前的函数调用中使用过,那么它们可能具有非零值,导致它们评估为“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,则条件不可能为真,因此没有理由继续判断bc是否也为真。< / 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。因此,它们的值没有定义,只要它们不会被初始化为零,就会被认为是真实的。