【问题标题】:C++ Statement can be simplifiedC++ 语句可以简化
【发布时间】:2017-12-28 15:42:21
【问题描述】:

为这个蹩脚的问题道歉。我正在为我的 C++ 课程使用 Intellij Clion Student 许可版本。作为实现 UnsortedList 类的一部分,我们必须编写一个方法 isInTheList 来查看数组中是否存在元素。类实现如下

bool UnsortedList::isInTheList(float item) {

    for (int i = 0; i < length; i++) {
        if (data[i] == item) {
            return true;
        }
        return false;
    }
}

但是,ide 在data[i] == item 处显示一个彩色标记,并弹出一个提示

Statement can be simplified less... (Ctrl+F1) 
This inspection finds the part of the code that can be simplified, e.g. constant conditions, identical if branches, pointless boolean expressions, etc.

对于之前检查列表是否为空的方法,我使用了以下简化形式而不是 if-else 语句。

bool UnsortedList::isEmpty() {
    return (length == 0);
}

但是,现在涉及迭代,我无法在前者中提出简化的陈述。任何帮助深表感谢。谢谢。

【问题讨论】:

  • @GauravSehgal 非常相关。 OP 没有找到简化版本,因为他们错过了第二个 returnif 之后执行 :)
  • 顺便说一句,CLion 不只是表达式可以简化。它还提供为您简化它。如果您允许它这样做,您可能会意识到自己的错误。
  • 我希望您也考虑一下,如果浮点数涉及任何类型的计算,它就不是精确值。所以 if (data[i] == item) 可能会失败,而是相互减去并且检查小于 lambda。
  • 自以为是的吹毛求疵:return 语句的操作数周围的括号(通常)是不必要的、混乱的,并且可能(在像 decltype(auto) 这样的特殊情况下)导致不同的、可能违反直觉的结果。跨度>
  • @file2cable 是这里:floating-point-gui.de

标签: c++ if-statement intellij-idea simplify


【解决方案1】:

修复

您的return false 应移出for 循环。


因为你不小心把它放在了for循环中,所以这个迭代永远不会第二次执行。

所以您的 IDE 认为 for 循环毫无意义,并建议您将其简化为:

return data[0] == item;

这显然不是你想要的。所以真的,这只是一个简单的转变来使它正确。

【讨论】:

    【解决方案2】:

    为什么不使用 STL?

    inline bool UnsortedList::isInTheList(float item) {
        return std::find(data, data+length, item) != data+length;
    }
    

    std::find 如果找到,则返回一个指向该元素的迭代器,如果没有找到,则返回一个等于过去最后一项的迭代器(即恰好传递的第二个参数)。您可以使用简单的相等性检查来确定是否找到。

    【讨论】:

    • 如果您可以展示如何按照 OP 的预期返回布尔值,那将会很有用。
    • 虽然这确实回答了“我无法提出简化的陈述”,但请注意,OP 还添加了 “在前者中”,这me 表示他们想要一个修复该代码的答案,而不是仅仅提出一种不同的方法来完成它,诚然,如果它是完整的,那将是更好的。
    • == 不应该是!=吗?
    • 我要补充一点,如果data 是一个静态大小的数组,那么std::begin(data)std::end(data) 等。生成比data+length 更清晰、更易于维护的代码。当然,如果它是一个动态数组,那么它们是不可用的,你所拥有的就是我们能做的最好的。我也不确定在此处添加 inline 会产生什么好处,而且它似乎也不适合进行辩论。
    • STL 现在是 C++ 标准库。 STL 至少已经死了 15 年。
    【解决方案3】:

    您实际上是在循环中的一次迭代后返回。那是你的编译器的评论。 你的代码可以通过简单的编写来简化:

    bool UnsortedList::isInTheList(float item) {
    
        if (length != 0) {
            return data[0] == item;
        }
    }
    

    请注意,这仍然是未定义的行为 (UB)。您的所有执行路径中都没有return。 如果您的列表为空,则永远不会进入循环,这会导致 UB,因为没有 return 语句,但函数必须返回 bool

    我想,你的意图是,写这样的东西。

    bool UnsortedList::isInTheList(float item) {
    
        for (int i = 0; i < length; i++) {
            if (data[i] == item) {
                return true;
            }
        }
    
        return false;
    }
    

    return false; 移出for loop 就可以了(仍然有更好的方法来实现这一点,但这是另一个话题)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-23
      相关资源
      最近更新 更多