我对C中的return语句有一个问题,它确实从它返回:
int base(int a)
{
if(a == 1)
return 0;
}
int inherit()
{
base(1);
// the rest of the code
}
因此,在inherit()
函数中,调用base()
,并在此情况下执行return 0
; inherit()
中的其余代码是否仍然执行? return语句如何真正起作用?
答案 0 :(得分:4)
您的代码有点太小而不舒服。我对此感到高兴:
int base(int a)
{
if (a == 1)
return 0;
return 37;
}
int inherit(void)
{
int n = base(1);
printf("Base(1) is %d\n", n);
return n + 3;
}
当inherit()
调用base()
时,会存储其当前状态,运行函数base()
,并返回一个值。在此代码中,返回值在变量n
中捕获,然后在printf()
调用中使用,return
在inherit()
内使用。那就是return
如何工作:它单方面停止当前函数的执行并继续在调用函数中。
即使在main()
中,return
终止当前函数并将值返回给调用函数,即C运行时 - 并且C运行时确保进程退出,通常会中继返回对环境的重视' (例如,Unix上的shell程序)。
请注意,修订后的代码可确保base()
始终返回值。不这样做会导致一般的未定义行为。如果只使用值1
作为参数调用该函数,那么它将是“确定”,但是为什么你首先调用该函数。因此,始终确保如果函数应该返回一个值,则函数的所有返回(特别是函数末尾的返回)将返回一个值。在原始代码中,最后没有return
- 这很糟糕!
答案 1 :(得分:1)
如果在代码中调用return
,则该函数中的代码一旦到达该点就会停止工作。然后控制将返回到调用它的函数,或者程序将结束,具体取决于程序在返回的位置。
答案 2 :(得分:1)
当然它继续执行其余的代码。 base
方法仅返回其中的显式return
。这也适用于inherit
方法。
如果您希望inherit
方法返回base
的值,请添加return
关键字。
int inherit()
{
return base(1);
// the rest of the code can now be left out actually
}
挑剔:
在您的示例中,编译器可能会抱怨,因为在a != 1
的情况下没有返回值。
所以你必须添加像
int base(int a)
{
if(a == 1)
return 0;
else
return 1;
}
答案 3 :(得分:1)
所以在inherit()函数中,调用了base(),它返回0,在这种情况下,inherit()中的其余代码是否仍然执行?
是的,它会执行。函数var dl = window.dataLayer;
var eecom = "";
var al = dl.length;
for (var i = 0; i < al; i++) {
if(dl[i].ecommerce){
eecom = dl[i].ecommerce;
break;
}
}
中的return
将向调用函数返回控制(或值)。
然后执行调用函数base
的其余部分,直到其范围结束或inherit()
中遇到return
。
注意 - 如果未满足inherit()
条件,函数base
也应return
值。正如其他人所指出的那样,它会调用未定义的行为。
答案 4 :(得分:1)
如果你写
int inherit()
{
int x=99;
x=base(1);
dothis();
// the rest of the code
}
然后x现在为0,程序进入下一行dothis();
答案 5 :(得分:1)
return
语句的行为由ISO C标准定义。引用N1570草案,第6.8.6.4节:
return
语句终止当前函数的执行 将控制权返回给其调用者。一个函数可以有任意数量的return
声明。如果执行带有表达式的
return
语句,则该值为 表达式作为函数调用的值返回给调用者 表达。如果表达式的类型与返回类型不同 它出现的函数的类型,该值被转换为 通过赋值给具有函数返回类型的对象。
所以,如果你有这样的功能:
int func(void) {
return 42;
}
你从其他一些函数调用它(甚至从同一个函数调用它;参见 recursion ):
#include <stdio.h>
int main(void) {
int result = func();
printf("%d\n", result);
}
然后函数调用func()
是表达式,它产生值42
。
使用返回类型void
定义的函数不会返回值。这样一个函数中的return
语句只是return;
而没有表达式。它终止了函数的执行,但没有返回值。
答案 6 :(得分:0)
由于您没有返回base
的结果,因此inherit
没有理由不执行剩余的行。
该函数一直执行,直到达到return
语句。在inherit
中,它遇到了函数调用 - base
。调用返回值的函数并不意味着返回该结果。
例如,如果有人发送我从商店取回收据 - 该商店给我收据的事实并不意味着我必须将其提供给首先发送给我的人。
另一方面,这将返回base
的结果,并且不会执行其余的代码。
int inherit()
{
return base(1);
// the rest of the code
}
答案 7 :(得分:0)
是的,在致电C:\Users\<username>\AppData\Roaming\ICAClient
C:\Users\<username>\AppData\Local\Citrix\Receiver
后,代码将继续运行,但 undefined behavior 。下面的编辑说明了捕获返回值并在分支语句中使用它。您应该始终包含非void函数的return语句:
base()
答案 8 :(得分:0)
return语句返回调用者可以使用的值。除了调用者使用该值(例如,检查if
语句中的值)时,返回值不会影响调用者代码中的任何内容。执行返回后,被调用函数将停止执行,并且已释放任何局部变量。
return语句可以返回单个字大小的值,例如int或指针。在较新的C版本中,return语句可以返回复合值(例如结构);在这种情况下,编译器会立即执行复制操作,因为返回的结构可能是被调用函数的本地(自动)变量。当这些变量在堆栈上分配时,它们将被调用者的下一次调用销毁(覆盖);因此,编译器必须立即保存它们。请注意,返回指向被调用函数的本地(自动)变量的指针是一个错误,因为该变量将在返回时被释放并且可能已被覆盖。
返回的值通常会在寄存器中返回。传统上在英特尔,这是eax
寄存器。
示例:
return i; // return the value of an int.
return p; // return a pointer p
struct MY_STRUCT S= {0}; // local struct S is on the stack
return S; // return the whole structure
//caller:
struct MY_STRUCT S2= myFunction(); // compiler copies S to S2
struct MY_STRUCT S= {0}; // local struct S is on the stack
return &S; // return pointer to S !!error:
//caller:
struct MY_STRUCT *S= myFunction(); // S will be overwritten with nex call!!
答案 9 :(得分:0)
没有考虑错过返回值的明显错误:
int inherit(){
int return_value = base(1);
// ------^
// the rest of the code
}
return语句如何真正起作用?
对于函数调用(在您的情况下inherit()
调用base()
),我们需要返回函数调用之后的指令,以便程序继续执行它的执行周期。此返回需要两条信息:
1. return
语句表示函数的执行结束,并且在低级和高级语言中具有相同的语义。 1 < / p>
2. 返回地址:处理器在完成函数调用后如何知道返回的位置?通常在调用函数时存储此信息。因此,当调用函数时,除了其他内容 2 之外,还存储了返回地址。主要使用两个特殊位置:特殊寄存器或堆栈。因此,当达到return
语句时,控制流将被传送到函数调用 3 之后的指令的地址。
除此之外,您还可以返回特定值,例如计算结果等,作为函数签名中的预定义返回类型,其值对执行是否继续没有直接影响。在您的情况下,如果从函数int
返回任何其他类型为base()
的有效值,则它将具有其余执行的未定义含义,因为base()
不提供返回所有可能输入的语句,这将导致未定义的行为。
inherit()
中的其余代码是否仍然执行?
对于您调用它的值,即:1
}它会在inherit()
函数返回其值后继续执行base()
中的任何内容。
1。高级语言允许默认的直通机制。也就是说,如果我们没有明确指定过程的结束,则在块结束时返回控制。
2。修改PC(程序计数器)。
3。存储的实际返回地址取决于处理器。一些 诸如SPARC之类的处理器存储呼叫指令本身的地址。其他 例如MIPS和Pentium存储调用后指令的地址 指令。
答案 10 :(得分:0)
C是面向过程的编程语言,与OOP的焦点不同 is on on on variable,Data Structures&amp;子程序。(但是这里的OOP也是一样的)
当您的程序在
中执行时int inherit()函数
它打电话给
int base(int a)
为a提供值1.这是一个子程序。因此,子程序本质上是由程序员分组的一组计算指令,原因可能是编码的简易性或更好的组织等等。
base(1);
子程序完成执行后,下一条加载/执行的指令就是紧随其后的指令。
现在你需要知道你的inherit()函数一直在执行,直到它遇到一个代码来表示它要停止。最常见的是
exit(0);//exit entire program
return val;//where val stores an integer(control returns to calling function,or program exits if it the only function
在函数/例程中执行上面的代码后,同一函数下面的所有代码都不会执行)
您甚至可以通过输入以下命令从void函数返回:
return;