我最近开始学习C ++,到目前为止我做得很好,直到我来了
功能声明和调用。
我完全不明白的是return
是什么以及为什么每个函数都需要它。
另外,为什么需要功能类型?例如
int xamplefunc(){}
什么是int类型?
编辑:嗯,我不确定我是否明白了。返回到底是做什么的?窗帘背后真的发生了什么?调用函数是否将返回值存储为变量,或者是什么?答案 0 :(得分:3)
就像
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
答案 1 :(得分:3)
也许它可以帮助你记住如何在数学中定义函数:函数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;
的效果相同。
答案 2 :(得分:2)
你所谓的函数“type”是函数的返回类型。这意味着对函数的调用返回该类型的对象。 return语句是函数返回的地方。
int random() {
return 4;
}
此函数返回int
。您可以调用它来为int赋值:
int n = random();
答案 3 :(得分:2)
您有一个银行系统。您想让用户请求他们的余额。您实现了getCurrentBalance方法。一旦在方法体中计算它,您将需要一个返回类型来回馈它们的余额。您还需要一个输入参数,他们的帐号可能是:
double getCurrentBalance (int AccountNo)
{
double balance = //Check balance for AccountNo in Database or whereever
return balance;
}
请不要过多考虑我使用的类型。我知道双重不是目前最好的。
return balance;
必须匹配我们的返回类型,即double。但是,您可以返回隐式转换为double的内容。如果您愿意,可以返回int balance(当然会失去精确度)。
答案 4 :(得分:1)
当你调用一个函数时,你有时想要得到一些东西,例如,你可以调用一个执行简单计算的函数(2x2),并且你想要答案。 如果没有办法回答答案,你需要求助于各种各样的解决方法。
你叫什么&#34;功能类型&#34;实际上是您希望从函数中获得答案的类型。在您的情况下,您希望函数返回int类型的值(例如数字)
如果xamplefunc定义如下:
int xamplefunc(){
return 2*2;
}
当你调用这个函数时,你会期望得到4。
答案 5 :(得分:1)
编译器必须知道return type
才能知道给定类型变量的bitsize
,registers
最适合以及要读取和写入的infer the memory addresses
以及address intervals
以获得最佳分配。
函数可能不返回值(void)。如果它确实返回一个值,则该值必须由函数的调用者获得。
被调用函数将其返回值放在调用函数已知的位置以及调用函数必须能够访问的位置。在执行ret
指令之前,返回值被放入内存中:
例如。鉴于以下功能:
int xamplefunc(int x, int y)
{
return x + y;
}
它将在x86机器上与MSVC编译器组装到:
:_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)也通过返回函数声明中最后一个声明的值来提供隐式返回。
答案 6 :(得分:0)
int xamplefunc(){}
返回类型int
的值并且不接收任何内容的函数。此代码不正确,因为没有return
,如果没有编译错误 - 将返回一些垃圾。
答案 7 :(得分:0)
执行某些操作后,通常需要将计算出的新值返回给函数调用者。 假设我想添加两个数字&amp;返回添加到调用者,然后我可以写函数为
int add(int x,int y)
{
return X+y;
}
这里的return语句告诉你,你输入int值。
如果您不想返回任何内容,那么您只需使用返回类型void,如下所示
void add(int x,int y)
{
//some statements;
}
答案 8 :(得分:0)
功能类型适当地表示返回类型。之所以这样称呼是因为它返回了你的例子中的指定类型
int xamplefunc(){}
将一个整数返回给你......
详细说明请查看以下链接 http://www.learncpp.com/cpp-tutorial/74a-returning-values-by-value-reference-and-address/