2014-11-05 112 views
2

什么意思return语句++

未能提供包含返回处于错误

一个循环结束后返回 “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; 
} 

它运作良好,我想知道哪些情况是“回报”是必须的。

+2

尝试调用'str_subrange(“”,“anything”)''。 – timrau 2014-11-05 03:55:52

+0

请注意,你的函数只会比较'str [0]'和'str [1]' - 在第一次迭代中返回。 – GingerPlusPlus 2014-11-05 07:36:51

回答

2

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

当您决定在循环或其他分组语句(例如“if”)中返回值时,请始终在您的头部手动运行您的代码,以确保您在每个有效路径上返回值,并且即使循环不跑。

+2

“您得到的结果是预先存储在堆栈中预期返回值的内存内容中的任何内容。” - 这不完全正确。例如,[here](http://goo.gl/W7IMWo)'bar'总是返回1,即使它从foo中选择使用返回非值的分支。如果使用警告进行编译,也不需要手动跟踪丢失的返回值。 – chris 2014-11-05 04:17:26

+0

@chris,酷网站,但对不起,我的集会不是最好的。 G ++看起来可以在不设置返回值的情况下跳出foo,尽管bar始终返回相同的结果。那是你在做什么?铿锵3.4.1看起来更宽容(并给出警告),并总是给两个例子1。 – MtRoad 2014-11-05 04:37:19

+1

是的,'foo'就是它的样子 - 如果给定值不是0,则返回1,如果给定值为0,则只返回没有指定值的值。但随后'bar'会使事情变得更有趣。如果它调用'foo(0)',编译器知道这是未定义的行为,因此该分支永远不会被采用。编译器假定分支不能被采用,并且总是选择另一个分支,它只返回1.除此之外,GCC肯定会用'-Wall'给出该警告。 – chris 2014-11-05 04:46:05

4

如果size是0,for循环根本不会执行,因此该方法没有返回值。

0

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