【问题标题】:How do I express that I want to do something "if a function returns true/false"我如何表达我想做某事“如果函数返回真/假”
【发布时间】:2011-03-28 03:01:31
【问题描述】:

我正在制作一个字典程序。在将单词添加到字典之前,AddWord 函数调用 SearchForWord 函数,如果搜索函数发现传递给它的单词已经在字典中,则返回 true。

在添加函数中,我希望它移动到它实际添加单词的部分,只有当搜索函数返回 false(意味着它没有找到单词)并且我不知道如何正确表达这一点时.

编辑:我从 emacs 复制并粘贴了这一切,格式很时髦,不要讨厌。

bool Dictionary:: AddAWord(string word)
{
  ofstream fout;  
  string fileName="#.txt";  
  fileName[0]=toupper(word[0]);  

  if(SearchForWord(word)=false){   //here i figured the SearchForWord function would be called and return either true or false  
    //add word  
  }else{  
    //dont add word  
  }

如果有帮助,这里是完整的搜索功能

bool Dictionary::SearchForWord(string word)  
{  
   ofstream fout;  
   ifstream fin;  
   string x;  
   string fileName="#.txt";  
   fileName[0]=toupper(word[0]);  
   fout.open(fileName.data());  
   if(!fin.eof()){  
     while(fin>>x){  
      if(x=word){  
       cout<<"Word found during search";  
       return(Dictionary::success);  
      }  
     }  
    }else{  
       return(Dictionary::failure);  
    }  
}

【问题讨论】:

  • 您的字典真的那么大,必须存储在磁盘上而不是存储在内存中吗?如果没有,这里可能有一个数据结构解决方案。 SearchForWord 似乎也是错误的 - 它打开 fout 但在 fin 中搜索
  • 此外,这两个函数都会对字符串进行无意义的复制,如果文件中没有单词,则不会返回任何值。不过,任何编译器都应该对此发出警告,请务必打开并查看警告。

标签: c++ syntax boolean


【解决方案1】:

你想要的;

if(SearchForWord(word) == false)

不是

if(SearchForWord(word) = false)

作为一种风格,最好去;

if( !SearchForWord(word) )

或者甚至更好;

bool word_found = SearchForWord(word);
if( !word_found )

我发现引入像这样命名良好的布尔变量非常有用,它提高了可读性,因为现在在你的脑海中大声朗读条件会导致“如果找不到单词”。此外,在大多数调试器中跟踪进度变得更容易且更少混乱。

【讨论】:

  • 其实我同意,我提出了一个快速的答案,然后开始编辑它,也许不是最佳做法
  • (抱歉我的评论不再有意义,因为我回复的评论已经消失)
  • @Bill 我倾向于删除不再相关的 cmets。
  • 与其引入命名变量,不如给函数起一个有意义的名字:isPresent,或者 contains。函数的名称通常是动词或动词短语;返回布尔值的谓词函数通常以 is 开头,但其他导致明确是或否答案的动词(如本例中的 contains)也是可以接受的。
  • @James - 当然,但通常您无法选择要调用的函数的名称。为工作使用临时布尔值的好处之一是您可以选择正确的名称。这实际上是一条评论。
【解决方案2】:

你想要:

if(!SearchForWord(word))

在比较布尔值时切勿使用==。您可能会不小心分配值,就像您在那里一样。考虑一下:

if(engagedInNuclearWar = true) { // typo. should be ==
    fireMissiles();
}

现在,当它触发时,它会做的第一件事是,因为只有一个等号,所以将engagedInNuclearWar 赋值为真。这是一个错误,我们要检查不分配。结果,我们在不应该发射导弹的时候发射导弹。一些实习生可能会因此失去工作(如果他没有在随后的核浩劫中丧生。)

相反,避免使用 ==,而是依赖布尔计算。

if(engagedInNuclearWar) { // no chance for = vs == typo
    fireMissiles();
}

【讨论】:

  • @Sherm:除了现在你的代码更难阅读,因为这不是自然语言表达自己的方式。只需打开编译器警告和/或从错误中吸取教训,您就不必长时间进行破坏性的编码实践。
  • @GMan - 我确实使用-Wall,我已经从我的错误中吸取了教训。这就是我如何学会一种更安全的方式来编写文字比较的方法。请不要对你不认识的人做出假设,好吗?
  • @GMan - 攻击你?你是认真的吗?我提出了礼貌的请求。我什至说请!
  • @Sherm:使用较旧的编译器是一个例外情况,这保证现代的一般做法不会改变。
  • @Sherm:这不仅对我来说很特殊,对一般编程社区来说也是如此,所以你是在一个特殊情况下工作的。 (出于某种原因,新编译器的发布频率高于维护旧编译器的频率。)不,标准根本没有提到警告,但每个现代编译器都会这样做。
【解决方案3】:
if (!SearchForWord(word)) {
    // add the word
} else {
    // don't add the word
}

【讨论】:

    【解决方案4】:

    你想做的事:if(!SearchForWord(word))

    使用 = 是赋值而不是布尔值。

    【讨论】:

      【解决方案5】:

      = 是赋值运算符。它用于为变量赋值(如a=5)。要检查a是否等于b,您必须编写a==b。 所以

      if(SearchForWord(word)=false)
      

      应该改为

      if(SearchForWord(word)==false)
      

      【讨论】:

        猜你喜欢
        • 2013-06-14
        • 1970-01-01
        • 2021-12-08
        • 1970-01-01
        • 1970-01-01
        • 2021-05-01
        • 2021-09-03
        • 1970-01-01
        • 2015-04-02
        相关资源
        最近更新 更多