[英]I don't understand what's return for
我最近开始学习C++,到目前为止我做得很好,直到我来到函数声明和调用。 我不明白的是return
的用途以及为什么每个函数都需要它。
另外,为什么需要函数类型? 例如
int xamplefunc(){}
int 类型有什么用?
编辑:好吧,我不确定我是否明白。 return 到底做了什么? 幕后究竟发生了什么? 调用函数将返回值存储为变量,还是什么?
它就像
return_type function_name(parameter list)
{
//body of the function
}
return_type指定函数返回的数据类型。 return_type可以为void,这意味着函数不返回任何数据类型。 function_name是函数的名称。 函数的名称应以字母或下划线开头。 参数列表由用逗号分隔的变量及其数据类型组成。 参数列表可以为空,这意味着该函数不包含任何参数。 参数列表应包含变量的数据类型和名称
例如,
int factorial(int n, float j)
好读
如@DeadMg http://www.wide-language.com/cpptuts/functions.html
也许它可以帮助你记住如何在数学中定义函数:函数f(x)接受参数x并返回一个可以从x计算的值。 例如,函数sin接受一个实数并返回另一个实数,即该数字的正弦值。
C ++函数就是这种模型。 因此,当您定义一个函数时,您必须告诉编译器该函数采用哪些类型的参数(这是括号中的参数列表)以及它返回的值的类型(这是您调用的返回类型上面的“函数类型”;请注意,在C ++中,术语“函数类型”用于不同的东西)。
因此,当您想编写一个用C ++计算正弦函数时,您可以按如下方式执行:
double sin(double x)
{
// code to calculate the sine of x
}
但是现在你遇到了另一个问题:与通常将函数编写为单个表达式的数学不同,在C ++中你会编写一些要执行的语句列表。 该语句列表通常会操纵许多值。 那么如何告诉编译器哪个值实际上应该作为x的正弦值返回?
对此的答案是return
语句。 所以你的功能可能如下所示:
double sin(double x)
{
double result = 0;
// code to modify result so finally it contains the sine of x
return result;
}
但请注意, return
不仅告诉编译器“这是返回的结果”,而且“当你到达这个语句时,你已经完成了, 现在返回给调用者。 ”
因此,请考虑以下代码,它使用特殊处理来检测NaN和无限值(为简单起见,我假设函数is_bad
和getnan
已经为此目的而编写):
double sin(double x)
{
if (is_bad(x))
return getnan(); // when this is executed, the function *immediately* returns
// if we get here, we therefore know the value x is a regular number
double result;
// calculate the sine
return result;
}
现在有时候你想写只是你想获得在通话中执行一些代码,但不需要返回一个值。 一些其他语言为此使用单独的构造文本,但C ++通过仅引入一个类型来模拟这种差异。 那种类型是void
。 在这种情况下,您不需要显式的return
语句,因为无论如何都无法返回。 例如:
void say_hello()
{
std::cout << "Hello!\n";
}
但请注意, return
语句对于早期返回仍然有用,这也是在这种情况下允许的原因:
void say_hello(std::string to_whom)
{
if (to_whom = "satan")
return; // I don't say hello to satan!
std::cout << "Hello " << to_whom << "!\n";
}
最后,关于main
函数的一个注释:这个函数的强制返回值也是int
。 使用该返回值,您可以告诉程序调用者您的程序是成功完成还是发生错误。 所以你可以写(使用<cstdlib>
定义的常量)
int main()
{
return EXIT_SUCCESS; // I've succeeded in doing nothing!
}
要么
int main()
{
return EXIT_FAILURE; // I have no idea what I was supposed to do,
// so I couldn't do it :-)
}
请注意,代替EXIT_SUCCESS
也可以返回0
表示成功(实际上,通常, EXIT_SUCCESS
只有值0
)
现在main
有一个额外的规则,与任何其他值返回函数不同,您可以省略return
语句。 如果这样做,效果与写return 0;
在功能的最后。
你称之为函数“type”的是函数的返回类型。 这意味着对函数的调用返回该类型的对象。 return语句是函数返回的地方。
int random() {
return 4;
}
该函数返回一个int
。 您可以调用它来为int赋值:
int n = random();
你有一个银行系统。 您想让用户请求他们的余额。 您实现了getCurrentBalance方法。 一旦在方法体中计算它,您将需要一个返回类型来回馈它们的余额。 您还需要一个输入参数,他们的帐号可能是:
double getCurrentBalance (int AccountNo)
{
double balance = //Check balance for AccountNo in Database or whereever
return balance;
}
请不要过多考虑我使用的类型。 我知道双重不是目前最好的。
return balance;
那必须匹配我们的返回类型,即double。 但是,您可以返回隐式转换为double的内容。 如果你愿意,你可以返回int balance(当然会失去精确度)。
当你调用一个函数时,你有时想要得到一些东西,例如,你可以调用一个函数来做一个简单的计算(2x2),你想要答案。 如果没有办法回答答案,你需要求助于各种各样的解决方案。
您所谓的“函数类型”实际上是您希望从函数中获得的答案类型。 在您的情况下,您希望函数返回int类型的值(例如数字)
如果xamplefunc定义如下:
int xamplefunc(){
return 2*2;
}
当你调用这个函数时,你会期望得到4。
编译器必须知道return type
,以便了解给定类型的变量的位大小,哪些registers
最适bitsize
infer the memory addresses
要读写infer the memory addresses
以及最佳的address intervals
。分配。
函数可能不返回值(void)。 如果它确实返回一个值,则该值必须由函数的调用者获得。
被调用函数将其返回值放在调用者函数已知的位置以及调用者函数必须能够访问的位置。 在执行ret
指令之前,返回值被放入内存中:
例如。 鉴于以下功能:
int xamplefunc(int x, int y)
{
return x + y;
}
它将在带有MSVC编译器的x86机器上组装到:
:_xamplefunc@8
push ebp
mov ebp, esp
mov eax, [ebp + 8]
mov edx, [ebp + 12]
add eax, edx
pop ebp
ret 8
或通过x86机器上的LLVM :
define i32 @xamplefunc(i32 %x, i32 %y) nounwind uwtable readnone {
%1 = add nsw i32 %y, %x
ret i32 %1
}
注意 :使用的顺序和寄存器可能因编译器和编译器以及版本而异,这是软件取证中的一个有用属性。
某些语言(例如Coffeescript)也通过返回函数声明中最后一个声明的值来提供隐式返回。
int xamplefunc(){}
返回int
类型的值并且什么都不接收的函数。 这段代码不正确,因为没有return
,如果没有编译错误 - 将返回一些垃圾。
在执行某些操作之后,通常需要将计算出的新值返回给函数调用者。 假设我想添加两个数字并向调用者返回添加,那么我可以将函数写为
int add(int x,int y)
{
return X+y;
}
这里的return语句告诉你,你返回int值。
如果你不想返回任何东西,那么你只需使用return type void,如下所示
void add(int x,int y)
{
//some statements;
}
函数类型恰当地表示返回类型 。 之所以这样称呼它是因为它在你的例子中返回指定的类型
int xamplefunc(){}
一个整数返回给你......
有关详细说明,请查看以下链接http://www.learncpp.com/cpp-tutorial/74a-returning-values-by-value-reference-and-address/
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.