C++ 何时从函数返回?
如果这个问题听起来很幼稚,请提前道歉。我正在编写一个简单的布尔函数来检查一个数字的所有数字是否相同。下面的作品,不管怎样,给了我一个错误C++ 何时从函数返回?,c++,function,return-type,C++,Function,Return Type,如果这个问题听起来很幼稚,请提前道歉。我正在编写一个简单的布尔函数来检查一个数字的所有数字是否相同。下面的作品,不管怎样,给了我一个错误 17:1: warning: control reaches end of non-void function [-Wreturn-type] 第二个我做错了什么 工作: # include <iostream> # include <string> using namespace std; bool samedigits (in
17:1: warning: control reaches end of non-void function [-Wreturn-type]
第二个我做错了什么
工作:
# include <iostream>
# include <string>
using namespace std;
bool samedigits (int number){
bool result = true;
std::string snumber = to_string (number);
for (int i=0; i < snumber.size(); i++){
if (snumber[i] != snumber[0]){
result = result and false;
break;
}
}
return result;
}
int main()
{
cout << samedigits (666);
return 0;
}
#包括
#包括
使用名称空间std;
布尔samedigits(整数){
布尔结果=真;
std::string snumber=to_字符串(数字);
对于(int i=0;i cout编译器是正确的。第二个代码段中有一个不会返回的代码路径
for (int i=0; i < snumber.size(); i++){
for(int i=0;i
在这里,std::string
size函数可以根据其约定返回0
。当它发生时,您的函数将不会进入循环。之后,您将退出函数而不返回。编译器是正确的。在第二个代码段中有一个不会返回的代码路径
for (int i=0; i < snumber.size(); i++){
for(int i=0;i
在这里,std::string
size函数可以根据它的约定返回0
。当它发生时,你的函数将不会进入循环。然后,你退出函数而不返回。你的算法不正确,你只检查第一个字符是否等于它本身,并且每次返回true相反,您应该将返回true
移动到循环外部,以便首先检查所有字符
不幸的是,警告是误报。编译器没有意识到当传递int
时,std::to_string
保证返回非空字符串。这意味着将输入for
循环体,函数将返回值。您的算法不正确,您只是在检查如果第一个字符等于它本身,并且每个输入都返回true。相反,您应该将返回true
移动到循环之外,以便首先检查所有字符
不幸的是,警告是误报。编译器没有意识到当传递int
时,std::to_string
保证返回非空字符串。这意味着将输入for
循环体,函数将返回值。函数的第二个版本(结合通过评论获得的一些信息)表明对return
的功能存在误解。第二个版本可以使用(以下是误解)如果return
语句只是存储指示值,以便在函数最终结束时使用。但是,这不是return
的工作方式。return
语句存储指示值,以便在函数结束并立即结束函数时使用因此,for
语句的也可能是一个if
,而break
永远不会执行,因为它紧跟在return
之后
为了演示,让我们对调用samedigits(123)
进行代码演练
当我们进入函数时,number
被设置为123
bool samedigits (int number){
std::string snumber = to_string (number);
for (int i=0; i < snumber.size(); i++){
字符串snumber
设置为“123”
我们检查snumber[0]
是否不等于snumber[0]
。这有点微不足道,但计算机愿意这样做。结果当然是错误的(与输入无关–如果循环从1而不是0
开始,这部分可能更有趣)。因此,如果
,请跳到后面的语句
return true;
该函数立即结束,返回true
就是这样。循环没有第二次迭代。在这个函数调用期间没有执行其他代码。由于to_string
从不返回空字符串,因此函数的第二个版本在功能上等同于以下内容:
bool samedigits (int /*number*/){
return true;
// Execution ends with the return statement, so nothing after
// this comment ever executes.
std::cout << "This is dead code. It will never execute.\n";
std::cout << "You will never see this output.\n";
}
bool samedigits(int/*number*/){
返回true;
//执行以return语句结束,因此之后不会有任何内容
//这条评论永远不会执行。
std::cout函数的第二个版本(结合通过注释获得的一些信息)表明对return
的功能存在误解。第二个版本可以工作(以下是误解)如果return
语句只是存储指示值,以便在函数最终结束时使用。但是,这不是return
的工作方式。return
语句存储指示值,以便在函数结束并立即结束函数时使用因此,for
语句的也可能是一个if
,而break
永远不会执行,因为它紧跟在return
之后
为了演示,让我们对调用samedigits(123)
进行代码演练
当我们进入函数时,number
被设置为123
bool samedigits (int number){
std::string snumber = to_string (number);
for (int i=0; i < snumber.size(); i++){
字符串snumber
设置为“123”
我们检查snumber[0]
是否不等于snumber[0]
。这有点微不足道,但计算机愿意这样做。结果当然是错误的(与输入无关–如果循环从1而不是0
开始,这部分可能更有趣)。因此,如果
,请跳到后面的语句
return true;
该函数立即结束,返回true
就是这样。循环没有第二次迭代。在这个函数调用期间没有执行其他代码。因为to_string
从不返回空字符串,所以函数的第二个版本