eturn语句终止当前执行的函数,并返回控制权到上层函数。
return; return expression;
两种形式,一种不含有值,一种含有值或表达式
无返回值类型
void swap(int &v1, int &v2) { if(v1 == v2) return; int tmp = v2; v2 = v1; v1 = tmp; // 此处没有显示的return语句, // 因为函数结束后会自行将控制权释放给上层调用者 }
带有返回值类型的函数
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; } }
尽管C++无法保证返回值的正确性,但是可以保证类型的正确性。
但是上面的函数存在两个错误,编译的时候将会被检查出来,我们来看看。
第一个错误,我们在23行的定义中没有给出返回值
第二个错误,当for循环完结但是没有return的情况下,是没有正确的return语句的,所以会发生不是所有路径都有返回值的警告。
最后我们将代码修改为以下的形式,解决了所有问题。
#include <string> using std::string; void swap(int &v1, int &v2) { if(v1 == v2) return; int tmp = v2; v2 = v1; v1 = tmp; // 此处没有显示的return语句, // 因为函数结束后会自行将控制权释放给上层调用者 } 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; } return false; } int main() { return 0; }