【问题标题】:Confused Why "control may reach end of non-void function"困惑为什么“控制可能到达非无效函数的结尾”
【发布时间】:2015-04-12 03:46:57
【问题描述】:

我编写了以下代码来检查向量的元素是否相等。但是,由于某种原因这是错误的,我无法确定原因。我确实认为“控件可能会到达非无效函数的结尾”。这没有意义,因为我看不到会发生这种情况。

任何帮助将不胜感激。

另外,这是在 xCode 中,更具体地说,程序是用 C++ 编写的。

bool equalElements(vector<string> fileExtensionsArray){
    for (int i=0; i<fileExtensionsArray.size(); i++){
    int j=i+1;
        if(fileExtensionsArray.at(i) == fileExtensionsArray.at(j)){
            return false;
        }
        else{
            return true;
        }
    }
}

【问题讨论】:

  • 如果fileExtensionsArray 为空,则循环体永远不会运行,因此不会到达return 语句。
  • 那么,我需要在标题中定义它的大小吗?或者,一个更好的问题是:我将如何解决这个问题? @IgorTandetnik
  • 您将决定equalElements 在使用空向量调用时应该返回什么,并相应地实现它。此外,您还应该决定如何处理单元素向量;目前,您访问的索引越界。此外,正如所写,您的功能没有多大意义。你有一个循环——但你总是在第一次迭代时返回。您只会将元素 0 与元素 1 进行比较,并仅根据该比较返回。没有查看其他元素。
  • 您的函数复制整个向量。为什么不通过 const 引用传递?如果向量不为空,则函数将在 for 循环仅迭代一次后返回。

标签: c++


【解决方案1】:

案例:fileExtensionsArray 为空。

如果您的fileExtensionsArray 是空的std::vector

fileExtensionsArray.size() 将等于 0

因此for 循环将永远不会被执行,因此不会有return 语句要执行。

要解决此问题,您只需在函数定义的末尾添加 return false

bool equalElements(vector<string> fileExtensionsArray){
    for (int i=0; i<fileExtensionsArray.size(); i++){
    int j=i+1;
        if(fileExtensionsArray.at(i) == fileExtensionsArray.at(j)){
            return false;
        }
        else{
            return true;
        }
    }
return false; //Empty vectors are equal? Maybe not.
}

【讨论】:

    【解决方案2】:

    如果fileExtensionsArray 为空会怎样? for-loop 不会执行,您的任何 return 语句都不会执行。

    【讨论】:

      【解决方案3】:

      您的函数定义保证了返回值。如果fileExtensionsArray 为空,则函数定义中缺少返回值。

      【讨论】:

        猜你喜欢
        • 2014-05-11
        • 2019-08-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-27
        • 1970-01-01
        • 2013-10-06
        • 1970-01-01
        相关资源
        最近更新 更多