【问题标题】:return statement in c++C++ 中的返回语句
【发布时间】:2014-11-05 03:52:03
【问题描述】:

什么意思

在包含返回的循环之后未能提供返回是错误

在“C++ 入门第五章”,第 295 页?

尤其是编译器没有检测到这个错误,运行时发生的事情是不确定的。

我使用的书样如:(vs2013)

#include "stdafx.h"
#include "iostream"
#include "string"
using std::string;

bool str_subrange(const string &str1, const string&str2) {
    if (str1.size() == str2.size())
        return str1 == str2;
    auto size = (str1.size() < str2.size()) ? str1.size() : str2.size();
    for (decltype(size)i = 0; i != size; ++i) {
        if (str1[i] != str2[i])
            return false;
        else
            return true;
    }
}

int _tmain(int argc, _TCHAR* argv[]) {
    if (str_subrange("lyc", "talent"))
        std::cout << "yes" << std::endl;
    else
        std::cout << "nope" << std::endl;;
    system("pause");
    return 0;
}

效果很好,我想知道哪些情况是必须“返回”的。

【问题讨论】:

  • 尝试拨打str_subrange("", "anything")
  • 请注意,您的函数仅将 str[0]str[1] 进行比较 - 在​​第一次迭代中它返回。

标签: c++


【解决方案1】:

如果size 为0,则for循环永远不会执行,因此该方法没有返回值。

【讨论】:

    【解决方案2】:

    如果 size 以 0 结尾(例如,其中一个字符串是“”),则您的循环永远不会运行。如果循环永远不会运行,那么返回的内容是未定义的,因为程序不会编写返回给函数调用者的结果。您得到的结果是堆栈中预期返回值的内存内容中预先存在的任何内容。

    当您决定在循环或其他分组语句(例如“if”)中返回值时,请始终在您的头脑中手动运行代码检查,以确保您在每个有效路径上都返回一个值,即使循环没有运行.

    【讨论】:

    • "你得到的结果是内存内容中预先存在的任何内容,即堆栈上预期返回值的位置。" - 这并不完全正确。例如,herebar 总是返回 1,即使它选择了使用来自 foo 的返回非值的分支。如果编译时出现警告,也无需手动跟踪丢失的返回值。
    • @chris,很酷的网站,但很抱歉我的程序集不是最好的。 G++ 看起来它可以在不设置返回值的情况下跳出 foo ,尽管 bar 总是返回相同的东西。这就是你的意思吗? Clang 3.4.1 看起来更宽容(并给出警告),并且两个示例都始终给出 1。
    • 是的,foo 就是它的样子——如果给定值不为 0,则返回 1,如果给定值为 0,则不指定任何值返回。但是使用 @ 后事情会变得更有趣987654326@。如果它调用foo(0),编译器知道这是未定义的行为,因此永远不能采用该分支。编译器不会返回任何垃圾,而是假定无法采用该分支并始终选择仅返回 1 的另一个分支。除此之外,GCC 肯定会使用-Wall 发出警告。
    • 您关于 Clang 的观点也很棒。无需通过bar,我们只需查看foo。它总是返回 1,而不是在某些情况下返回任何垃圾,在其他情况下返回 1。
    • @chris,真的很酷,你是怎么学到的,我是怎么学到更多关于这样的东西的?我玩过 Clang/LLVM 并且正在阅读 Dragon 的书,但我不确定还能去哪里。
    【解决方案3】:

    在这种使用循环的情况下,如果条件总是从函数末尾返回,在开始时分配一个返回值并根据条件更新该值。

    【讨论】:

      猜你喜欢
      • 2013-04-05
      • 1970-01-01
      • 2017-09-10
      • 1970-01-01
      • 2013-08-25
      • 2015-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多