之前我问过这个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是否返回函数中的最后一个计算变量?
答案 0 :(得分:7)
是否有必要在非void函数中使用return命令?
是。这是从非void
函数返回值所必需的。
从您的函数中省略return
语句,但将其分配给sum
中的main
将调用未定义的行为。在这种情况下,有时你可能得到你期望的结果,有时候我得到的结果,有时候是编译器期望的!有时它也可能会崩溃
正如他在评论中提到的Pascal Couq:
12:如果到达了终止函数的
}
,并且调用者使用了函数调用的值,则行为是未定义的。
答案 1 :(得分:6)
这只是巧合。
最有可能的是,a+b
的值存储在EAX
寄存器中。通常EAX
寄存器也用于存储函数的返回值。
与main
中的实际返回值一样,EAX
中的实际返回值再次用于将值传递给printf
函数。因此,您获得了预期的输出。
答案 2 :(得分:0)
您没有提到您正在使用的编译器或您正在编译它的机器。但一般情况下,如果在函数中省略return语句,编译器将返回错误。这是依赖于实现的,因为标准提到这是未定义的行为
就返回的值而言,这取决于调用约定。每个体系结构都定义了它在函数调用中使用的寄存器集(其中返回值,用于传递参数等等)。所以对你来说,这只是一个巧合,结果最终会出现在正确的寄存器中。它可能是您正在使用的编译器的行为。 如果您尝试使用其他编译器,则可能会得到不同的结果。