是非必需的返回命令吗?

时间:2013-11-20 10:10:22

标签: c function return-value

之前我问过这个question,我理解了很多东西。我怀疑这里发生了类似的事情,所以我想确定一下。我有这个简单的程序,可以添加2个数字。

#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.
}

由于此函数不是void,因此函数中有return语句。如果我省略了返回值,保存并编译它,我没有从编译器得到任何错误(也没有警告)。当我运行它时,它给了我一个正确的结果。

但程序如何知道返回哪个值,因为我没有指定任何值? C是否返回函数中的最后一个计算变量?

3 个答案:

答案 0 :(得分:7)

  

是否有必要在非void函数中使用return命令?

是。这是从非void函数返回值所必需的。

从您的函数中省略return语句,但将其分配给sum中的main将调用未定义的行为。在这种情况下,有时你可能得到你期望的结果,有时候我得到的结果,有时候是编译器期望的!有时它也可能会崩溃 正如他在评论中提到的Pascal Couq

6.9.1函数定义:

  

12:如果到达了终止函数的},并且调用者使用了函数调用的值,则行为是未定义的。

答案 1 :(得分:6)

这只是巧合。

最有可能的是,a+b的值存储在EAX寄存器中。通常EAX寄存器也用于存储函数的返回值。

main中的实际返回值一样,EAX中的实际返回值再次用于将值传递给printf函数。因此,您获得了预期的输出。

答案 2 :(得分:0)

您没有提到您正在使用的编译器或您正在编译它的机器。但一般情况下,如果在函数中省略return语句,编译器将返回错误。这是依赖于实现的,因为标准提到这是未定义的行为

就返回的值而言,这取决于调用约定。每个体系结构都定义了它在函数调用中使用的寄存器集(其中返回值,用于传递参数等等)。所以对你来说,这只是一个巧合,结果最终会出现在正确的寄存器中。它可能是您正在使用的编译器的行为。 如果您尝试使用其他编译器,则可能会得到不同的结果。