2011-06-17 35 views
0

问题与返回的在C++中布尔..C++返回boolean值95

bool find(const TrieNode &node, const string word) 
{ 

    if (word.length() == 0) 
    { 
     if (node.isWord) 
     { 
     cout << "TRUE" << endl; 
     return true; 
     } 

     else 
     { 
     cout << "FALSE" << endl; 
     return false; 
     } 
    } 

    char firstletter = word.at(0); 
    int index = firstletter - 'a'; 

    if (node.letters[index] == NULL) 
    { 
    return false; 
    } 

    else 
    { 
    find (*node.letters[index],word.substr(1,(word.length() - 1))); 
    } 

} 

我主我

cout << find(*mynode,"word") << endl; 

会屈服于:

FALSE

显然,a cout of FALSE意味着该函数返回false ..但是,当我打印出函数的结果时,我得到95的结果为true。任何理由为什么它可以这样做?

感谢

回答

6

你错过了最后的return语句,让你获得无论是在的EAX低字节,这是随机的垃圾。你可能需要return true;在你的函数的最后。

你应该提高编译器的警告级别,因为它应该告诉你这一点(沿着“并非所有控制路径返回值”的行)。

+0

好奇,虽然该流插入运算符实际打印95,这可能意味着不存在“布尔“插入,它只是投给一个int? – 2011-06-17 06:38:53

+0

@ edA-qa:它可能被扩展/提升为int,但在大多数(x86)系统中,“bool”是一个字节,它使它成为一个数字并且不局限于1/0。 – Necrolis 2011-06-17 07:14:39

+0

很明显,一个明显的错误(C中的未定义行为,C++中的非法行为)编译时没有警告,除非明确要求它。除了最大警告级别之外,不能编译的另一个很好的理由。 – Damon 2011-06-17 07:47:24

5

的问题是您的最终if声明:

if (node.letters[index] == NULL) { 
    return false; 
} 
else { 
    //if execution gets here, the return value of the function is undefined 
    find (*node.letters[index],word.substr(1,(word.length() - 1))); 
} 

...也许尝试:

if (node.letters[index] == NULL) { 
    return false; 
} 
else { 
    return find (*node.letters[index],word.substr(1,(word.length() - 1))); 
} 
+0

谢谢。它解决了这个问题。我的印象是回归是隐含的?我的一位朋友从事相同的任务并不需要提交退货声明(虽然他的代码有些不同) – cozos 2011-06-17 05:58:24

+1

有一种习惯可以帮助避免这种错误(以及更简洁和可读的 - 至少一旦你习惯了对于它 - 比较喜欢'return ...',例如'return node.letters [index] && find(...);'。每当有if(...)return ...; else return。 ..''这是一个好主意,但特别是当有一个带有硬编码的'true'和/或'false'的return语句时,它鼓励你理清逻辑,以便在语句中做出肯定的断言 - like变量应该被称为'is_x'而不是'is_not_x'--这样做一贯有助于代码的理解和正确性。 – 2011-06-17 06:16:15

+0

@IWWin:'return'只从'int main(...)'中隐含,它返回'EXIT_SUCCESS'(通常为0)如果在没有显式执行的'return'语句的情况下离开范围(这是C++特有的 - 您必须以C返回) – 2011-06-17 06:17:49