C 非void函数中是否需要return命令?
我以前问过这个问题,我了解很多事情。我怀疑这里也发生了类似的事情,所以我想确定一下。我有一个简单的程序,可以添加两个数字C 非void函数中是否需要return命令?,c,function,return-value,C,Function,Return Value,我以前问过这个问题,我了解很多事情。我怀疑这里也发生了类似的事情,所以我想确定一下。我有一个简单的程序,可以添加两个数字 #include <stdio.h> int addFunc(int, int); int main() { int sum; int num1=1, num2=2; sum = addFunc(num1,num2); //function call printf("\nsum = %d\n\n", sum);
#include <stdio.h>
int addFunc(int, int);
int main()
{
int sum;
int num1=1, num2=2;
sum = addFunc(num1,num2); //function call
printf("\nsum = %d\n\n", sum);
return 0;
}
int addFunc(int a,int b) //function declarator
{
int add;
add = a + b;
return add; //return statement of function.
}
#包括
int addFunc(int,int);
int main()
{
整数和;
int num1=1,num2=2;
sum=addFunc(num1,num2);//函数调用
printf(“\nsum=%d\n\n”,总和);
返回0;
}
int addFunc(int a,int b)//函数声明符
{
int-add;
加法=a+b;
return add;//函数的return语句。
}
由于此函数不是void
,因此函数中有一条return
语句。如果省略返回值,保存并编译它,则不会从编译器中得到任何错误(或警告)。当我运行它时,它会给我一个正确的结果
但既然我没有指定任何值,程序如何知道返回哪个值呢?C是否返回函数中最后计算的变量
在非void函数中是否需要return命令
对。这是从非void
函数返回值所必需的
从函数中省略return
语句,但将其分配到main
中的sum
将调用未定义的行为。在这种情况下,有时您可能会得到您期望的结果,有时是我期望的结果,有时是编译器期望的结果!!有时它也可能崩溃。正如他在评论中提到的: 6.9.1功能定义: 12:如果到达了终止函数的
}
,并且调用方使用了函数调用的值,则行为未定义
这只是巧合
a+b
的值很可能存储在EAX
寄存器中。通常,EAX
寄存器也用于存储函数的返回值
与
main
中一样,实际返回值在EAX
中可用,它再次用于将值传递给printf
函数。因此,您将获得预期的输出。您没有提到您正在使用的编译器或编译此文件的机器。但一般来说,如果在返回值的函数中省略return语句,编译器将给出一个错误。这取决于实现,因为标准提到这是未定义的行为
就返回的值而言,这取决于调用约定。每个体系结构都定义了自己在函数调用中使用的寄存器集(返回值的位置、传递参数的位置等等)。所以对你来说,结果出现在正确的寄存器中只是巧合。这可能是您正在使用的编译器的行为。
如果您尝试不同的编译器,可能会得到不同的结果。返回的值未定义。我猜问题实际上是为什么他的程序编译后仍然返回正确的结果?因为未定义的行为意味着任何事情都可能发生。“任何事情”包括:程序崩溃和烧毁、程序正常运行、程序看似正常但在某些条件下崩溃、程序做完全随机的事情等。使用
gcc-Wall
编译它。它给出了警告:如果您还添加了-Werror
标志,则控件将到达非无效函数的末尾[-Wreturn type]
更好。@ams“据我所知,调用方是否使用结果并不重要”请参阅接受的答案。程序intf(void){intx=1;x++;}intmain(void){f();}
是一个有效的C99程序。+1 C99标准中的相关条款是6.9.1:12“如果达到终止函数的}
,并且调用方使用了函数调用的值,则行为未定义”(注意,如果执行到达任何返回e;
,即使作为final语句,但不一定如此,这意味着没有到达final}
。)非常感谢@PascalCuoq提供标准参考。我搜索了标准,但没有找到这句话。+1我更喜欢这个答案,因为它解释了它是如何工作的。很抱歉,在这篇文章中没有看到这些细节,但不管怎样,我希望你能得到答案。