C++ 对于带括号的循环中的return语句,将显示错误可能到达非void函数的末尾,但对于不带括号的循环,则不显示错误
在第一种情况下,它显示错误:控制到达非void函数的末尾。 但在第二种情况下,即使代码执行与第一种代码相同的操作,也不会显示任何错误。有人能告诉我编译器在这两种情况下到底发生了什么吗? 还有,为什么案例1中的return语句不被确认C++ 对于带括号的循环中的return语句,将显示错误可能到达非void函数的末尾,但对于不带括号的循环,则不显示错误,c++,C++,在第一种情况下,它显示错误:控制到达非void函数的末尾。 但在第二种情况下,即使代码执行与第一种代码相同的操作,也不会显示任何错误。有人能告诉我编译器在这两种情况下到底发生了什么吗? 还有,为什么案例1中的return语句不被确认 //case 1 int checkA(const vector<int>& a, int n, int k) { for(int i=0; i<n; i++) { if(k%a[i])
//case 1
int checkA(const vector<int>& a, int n, int k)
{
for(int i=0; i<n; i++)
{ if(k%a[i])
return 0;
return 1;
}
}
//case 2
int checkA(const vector<int>& a, int n, int k)
{
for(int i=0; i<n; i++)
if(k%a[i])
return 0;
return 1;
}
//案例1
整数校验a(常数向量&a,整数n,整数k)
{
对于(int i=0;i在第一种情况下,您在循环中无条件地返回1;
。但是如果循环没有运行(当n
在第二种情况下,即使代码执行与第一种代码相同的操作,也不会显示任何错误
这是不正确的。在第二种情况下,代码执行不同的操作
有人能告诉我编译器在这两种情况下到底发生了什么吗
假设您调用checkA({2,5},2,2)
在案例1中,您的函数执行以下操作:
i=0;
- 检查
i它不会做同样的事情。如果您发布的代码片段格式更好,您将看到以下内容:
//case 1
int checkA(const vector<int>& a, int n, int k)
{
for(int i=0; i<n; i++)
{
if(k%a[i])
return 0;
return 1;
}
}
//案例1
整数校验a(常数向量&a,整数n,整数k)
{
对于(int i=0;i我坚决支持在for
、while
、和if
语句下使用{}
块,即使只有一行代码。这使代码更容易理解。使用这种方法
案例1相当于:
int checkA(常量向量&a,int n,int k)
{
对于(int i=0;i“…代码做同样的事情…”不,不是。是什么让你想到这个主意的?第二个代码段中的return
语句在for
循环之外,在第一个代码段内部。因此,如果n
为0
或更小,第一个代码段将永远不会返回任何内容,因为循环体没有执行。它不会执行相同的操作。在第一种情况下,return 1
在循环内。如果代码没有进入循环(n
小于或等于0),函数将不返回任何内容。第二种情况下,return 1
在循环外,它完全正常(总是返回)。好的。我理解了。谢谢
//case 2
int checkA(const vector<int>& a, int n, int k)
{
for(int i=0; i<n; i++)
if(k%a[i])
return 0;
return 1;
}
int checkA(const vector<int>& a, int n, int k)
{
for(int i=0; i<n; i++)
{
if(k%a[i])
{
return 0;
}
// return statement in the loop outside the if statement.
return 1;
}
// No return statement after the loop.
}
int checkA(const vector<int>& a, int n, int k)
{
for(int i=0; i<n; i++)
{
if(k%a[i])
{
return 0;
}
// no return statement in the loop outside the if statement.
}
// return statement after the loop.
return 1;
}