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我更喜欢这个答案,因为它解释了它是如何工作的。很抱歉,在这篇文章中没有看到这些细节,但不管怎样,我希望你能得到答案。