需要返回值的函数,没return会怎么样?
扫描二维码
随时随地手机看文章
直接说结论,如果一个函数声明了返回类型(如int、float、char等),那它必须在所有可能的执行路径上返回一个相应类型的值。否则,会导致未定义行为。
下面会详细探讨不同情况下不返回值的后果,包括普通函数和main函数。
普通函数不返回值
当一个普通函数声明了返回类型但没有在所有路径上返回值时,它的行为是未定义的。
未定义意味着程序可能表现出任意行为,包括崩溃、产生错误结果或偶尔正常工作。
示例代码:
#includeint shouldReturnValue() { printf("This function is supposed to return an int.\n"); // No return statement! } int main() { int value = shouldReturnValue(); // Undefined behavior! printf("Value: %d\n", value); return 0; }
在上面的代码中,shouldReturnValue函数声明返回int,但实际上没有返回任何值。当main函数调用shouldReturnValue并试图使用其“返回值”时,程序行为未定义。可能的后果包括value变量包含垃圾值,或程序异常终止。
熟悉函数调用栈帧的朋友应该会知道原理,函数的返回值会保存在某个寄存器上或者栈的某个位置处,如果某个函数它应该返回值却没返回,那就会复用之前这个寄存器上或栈上的值,其行为那就是未定义了。
main函数不返回值
main函数是C程序的入口点,它的返回类型通常是int。
根据标准,main函数应返回一个整数,该整数通常用于指示程序的退出状态。返回0通常表示程序成功执行,非零值表示发生了错误或异常情况。
如果main函数没有返回值,大多数现代C编译器会隐式地插入一个return 0;的语句。
然而,依赖这种隐式行为并不是好的编码习惯,它可能不是所有编译器都支持。
示例代码:
#includeint main() { printf("Hello, World!\n"); // No return statement! }
最好是显式地返回一个值,如:
#includeint main() { printf("Hello, World!\n"); return 0; // Explicit return statement }
我们直接看汇编代码来确认int main是否会隐式返回0。
先看带有return 0的汇编代码:
xor eax, eax,表示使用异或操作将eax寄存器的值清零。在x86-64架构中,main函数的返回值通常通过eax寄存器传递。因此,这行代码表示main函数返回0。
再看不带有return 0的汇编代码:
这里可以看到,还是有xor eax, eax的指令,这表示编译器会隐式的给我们**return 0**。





