我最近开始学习 C++,到目前为止我做得很好,直到我来到函数声明和调用。我不完全了解的是return
每个功能的用途以及为什么每个功能都需要它。
另外,为什么需要函数类型?例如
int xamplefunc(){}
int 类型有什么用?
编辑:嗯,我不确定我是否明白了。return 究竟是做什么的?幕后究竟发生了什么?调用函数是否将返回值存储为变量,还是什么?
我最近开始学习 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
one 之外,还可以返回0
表示成功(实际上,通常EXIT_SUCCESS
只有 value 0
)
现在main
有一个附加规则,与任何其他返回值的函数不同,您可以省略该return
语句。如果你这样做了,效果和你return 0;
在函数末尾写的一样。
您所说的函数“类型”是函数的返回类型。这意味着对该函数的调用将返回该类型的对象。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;
这必须匹配我们的返回类型,即双精度。但是,您可以返回隐式转换为双精度的内容。如果您愿意,您可以返回 int balance(当然会失去精度)。
当你调用一个函数时,你有时想要得到一些东西,例如,你可以调用一个执行简单计算(2x2)的函数,并且你想要答案。如果没有办法返回答案,您将需要求助于各种解决方法。
您所谓的“函数类型”实际上是您希望从函数中获得的答案的类型。在您的情况下,您希望该函数返回一个 int 类型的值(例如一个数字)
如果 xamplefunc 是这样定义的:
int xamplefunc(){
return 2*2;
}
当您调用该函数时,您会期望返回 4。
编译器必须return type
知道这些变量,以便了解给定类型的变量,哪些是最适合的,哪些是读取和写入的,以及最佳分配。bitsize
registers
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 值。
如果你不想返回任何东西,那么你只需使用返回类型 void 如下
void add(int x,int y)
{
//some statements;
}
Function 类型被恰当地称为返回类型。之所以这样调用它是因为它返回了您示例中的指定类型
int xamplefunc(){}
一个整数返回给你......
有关详细说明,请查看以下链接 http://www.learncpp.com/cpp-tutorial/74a-returning-values-by-value-reference-and-address/