我目前正在阅读c ++中的函数。它表示它们是“工件,它们使您能够将应用程序的内容划分为可以按您选择的顺序调用的功能单元。一个函数在被调用时通常会向调用函数返回一个值。”
然后继续说main()被编译器识别为c ++应用程序的起点,并且必须返回一个int(整数)。
我不知道'必须返回一个整数'是什么意思。从我的(非常有限的经验)int main()是您的应用程序的开始。但是'必须返回一个int'是什么意思?这也与我交织在一起,不理解'通常会向调用函数返回一个值'
答案 0 :(得分:9)
就像在数学中一样,在C ++函数中返回值。 C ++中的所有函数必须准确指定它们返回的值的类型,并且每个函数必须只返回一种类型的东西。在某些情况下,“一种类型的东西”可能 nothing ,在C ++中用关键字void
表示。
每个函数都必须声明它返回的内容。这是通过函数声明完成的。以下是几个例子:
int foo();
void bar();
string baz();
int main();
4个函数声明。 foo
返回int
,bar
不返回任何内容,baz
返回string
(在C ++标准库中声明),main
返回一个int。
每个函数都必须声明它返回的内容,它还必须返回那种类型的东西。如果函数返回void
,那么您可以写:
void bar()
{
return;
}
......或者什么都不做:
void bar()
{
}
如果你的函数返回void
以外的任何函数,那么你必须有一个return
语句来返回那种类型的东西:
int foo()
{
return 42;
}
如果你声明一个函数返回一种类型的东西,但是然后尝试返回另一种类型的东西,那么要么必须有一种方法来隐式地转换你试图转换的任何东西声明函数返回的内容。如果没有可能的隐式转换,则程序将无法编译。考虑:
int foo()
{
return "foobar rulez!";
}
在这里,foo
被声明为返回int
,但我正在尝试从标准库中返回一个字符串(不是string
,而是一个旧的C风格{ {1}} string。`“foobar rulez!”这里称为字符串文字。)
可以编写代码来提供我之前提到的隐式转换,但是除非你确切知道为什么要这样做,否则最好不要在现在所有内容中混淆。
您如何处理从函数返回的值?再次,就像数学一样,您可以在程序中的其他位置使用这些值。
const char*
显然,对于返回#include <cstdlib>
#include <iostream>
int foo()
{
return 42;
}
int main()
{
int answer = foo();
std::cout << "The answer to Life, the Universe and Everything is...\n"
<< answer << "!\n";
return 0;
}
的函数返回的值,您无法执行任何操作,因为返回void
的函数根本不会返回任何内容。但是这些功能对于做一些有用的东西很有用。
void
好的,使用#include <cstdlib>
#include <iostream>
int theAnswer = 0;
void DeepThought()
{
theAnswer = 42;
}
int foo()
{
return theAnswer;
}
int main()
{
DeepThought();
int answer = foo();
std::cout << "The answer to Life, the Universe and Everything is...\n"
<< answer << "!\n";
return 0;
}
返回所有这项业务。
main
是C ++中的一个函数。与{C ++中的其他函数相比,main
有一些特殊之处使它变得特别,其中两个是:
main
的函数(在全局范围内)。main()
int
还有一件事有点特别,可能令人困惑。您实际上不必在main
*中编写return
语句,即使它被声明为返回main
。考虑:
int
请注意,这里没有返回声明。这在{+ 1}}的C ++中是合法且有效的,但int main()
{
}
是允许使用的唯一函数。如果所有其他函数未返回main
,则必须具有明确的main
语句。
那么return
的返回值呢?在Windows或Linux计算机上运行程序时,程序会向操作系统返回一个值。该值意味着什么取决于程序,但通常值void
意味着程序运行没有任何问题。 main()
以外的值通常意味着程序不起作用,而确切的值实际上是出错的代码。
脚本和其他程序可以使用这些返回值来决定下一步该做什么。例如,如果您编写了一个程序来根据艺术家和曲目编号重命名MP3文件,那么您的程序可能会返回0
如果有效,0
如果它无法找出艺术家,和0
如果它无法找出轨道号码。您可以在重命名然后移动文件的脚本中调用此函数。如果您希望在重命名文件时出现错误而退出脚本,那么它可以检查这些返回值以查看它是否有效。
1
中没有明确的return语句:如果2
没有明确的main
,则定义为返回值{{1 }}。答案 1 :(得分:5)
虽然在用C或C ++编程时可能会出现这种情况,但main
实际上并不是“第一件事”。通常,在C或C ++运行时库的内容中的某个地方是对main
的调用,它启动您的程序。当程序完成并从main
返回时,它将返回一个值(在C ++中,如果你没有指定某些东西,编译器会自动添加return 0
),这个返回值用于表示该计划的“成功”。
在Unix / Linux等中,这被用作$?
,所以你可以echo $?
运行程序后查看“结果”是什么 - 0表示“顺利”,其他值是用于“失败”。在Windows中,批处理脚本等中有一个ERRORLEVEL
变量,可用于查看最后一个命令的结果。
编辑:如果您的代码调用另一个程序,例如通过Windows中的CreatProcess或Unix风格的操作系统中的fork()/exec()
(或几乎所有操作系统中的C运行时函数spawn
和兄弟姐妹),来自main
的返回值是新进程完成的,并为拥有过程提供。结束编辑。
因为,即使在C ++中,main
是一个“C”样式函数,如果更改返回类型,它仍然具有相同的名称,因此链接器/编译器无法“检测”它是否具有错误的返回类型,如果你声明void main()
,std::string main()
或float main()
或int main()
以外的其他内容,会发生一些奇怪的事情 - 它仍会编译,但会发生什么调用main
的代码将是未定义的行为 - 这意味着“几乎任何事情都可能发生”。
答案 2 :(得分:0)
是的,main
应始终返回int
,这可用于显示程序是否成功运行,通常0
代表成功,非-zero值代表某种失败。
例如,在Linux中,您可以使用bash脚本调用程序,并在此脚本中,对程序的返回状态运行不同的命令。
答案 3 :(得分:0)
这意味着,在main()
的签名中,返回类型为int
:
int main();
int main(int argc, char const *argv[]);
现在问题是你从main()
返回的价值。好吧,返回值实际上是退出状态,它向运行时指示main()
执行是成功还是失败。
在Linux中,我通常会根据具体情况返回EXIT_SUCCESS
或EXIT_FAILURE
。这些是由<cstdlib>
定义的宏。
int main()
{
//code
if ( some failure condition )
return EXIT_FAILURE;
//code
return EXIT_SUCCESS;
}
根据doc:
#define EXIT_SUCCESS /*implementation defined*/
#define EXIT_FAILURE /*implementation defined*/
EXIT_SUCCESS和EXIT_FAILURE宏扩展为整数表达式并指示程序执行状态。
Constant Explanation EXIT_SUCCESS successful execution of a program EXIT_FAILURE unsuccessful execution of a program
答案 4 :(得分:0)
这是向操作系统报告程序退出状态的方式,无论它是否成功运行。例如,在Linux中,您可以使用以下命令:
echo $?
获取之前运行的程序的退出状态。