C语言子程序定义了返回类型,未return,为何能返回值
#include "stdio.h"
void main()
{
float a[]={1,2,3,4,5,6};
float b;
unsigned length=6;
b=sum(a,length);
printf("数值%f",b);
}
float sum(float a[],unsigned length)
{
int i;
float result =0;
for(i=0;i<=length-1;i++)
{
printf("%d",i);
}
}
这个程序, 我没有写return 返回值,可是编译运行后居然返回了值 6
这是为什么。 反汇编进入CALL后 发现:
004010B0 > 55 push ebp
004010B1 8BEC mov ebp, esp
004010B3 83EC 48 sub esp, 48
004010B6 53 push ebx
004010B7 56 push esi
004010B8 57 push edi
004010B9 C745 F8 0000000>mov dword ptr [ebp-8], 0
004010C0 C745 FC 0000000>mov dword ptr [ebp-4], 0
004010C7 EB 09 jmp short 004010D2 //循环开始
004010C9 8B45 FC mov eax, dword ptr [ebp-4] // 取出i的值
004010CC 83C0 01 add eax, 1 //eax累加 循环结束后 是6
004010CF 8945 FC mov dword ptr [ebp-4], eax
004010D2 8B4D 0C mov ecx, dword ptr [ebp+C]
004010D5 83E9 01 sub ecx, 1
004010D8 394D FC cmp dword ptr [ebp-4], ecx
004010DB 77 13 ja short 004010F0 //循环结束 跳出循环
004010DD 8B55 FC mov edx, dword ptr [ebp-4]
004010E0 52 push edx
004010E1 68 24404200 push 00424024 ; ASCII "%d"
004010E6 E8 25000000 call printf
004010EB 83C4 08 add esp, 8
004010EE ^ EB D9 jmp short 004010C9
有点乱。然后回到主程序 EAX被当做返回值 也就是6, 我想知道这是编译器的有意为之?还是纯粹是个巧合?