自从我多年前意识到这一点,默认情况下这不会产生错误(至少在GCC中),我一直想知道为什么?
我知道您可以发出编译器标志来产生警告,但是它不应该总是出错吗?为什么非void函数没有返回值才有效?
评论中要求的示例:
#include <stdio.h>
int stringSize()
{
}
int main()
{
char cstring[5];
printf( "the last char is: %c\n", cstring[stringSize()-1] );
return 0;
}
Run Code Online (Sandbox Code Playgroud)
...编译.
使用下面的例子,请解释为什么有时候不需要return语句?函数具有返回类型,但缺少return语句.同时,程序编译和工作正常.
请帮助我更好地理解这一点
char* handleInput() {
fgets(buffer, 1024, stdin);
**// return buffer;** <---- COMMENTED RETURN
}
void main() {
char* ptr = handleInput();
int flag = atoi(ptr);
if (flag < 0) break;
printf("You entered: %s\n", ptr);
}
Run Code Online (Sandbox Code Playgroud) 我想我发现 gcc 编译器处理函数的方式有问题。
我不知道这是一个错误还是我多年来忽略的东西从来没有分心。实际上,通过声明一个函数并定义后者具有返回值,编译器将在函数范围内分配的第一个变量的值存储在 EAX 寄存器中,然后依次将其存储在一个变量中。例子:
#include<stdio.h>
int add(int a, int b)
{
int c = a + b;
;there isn't return
}
int main(void)
{
int res = add(3, 2);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这是输出:
5
Run Code Online (Sandbox Code Playgroud)
这是具有 intel 语法的 x86-64 程序集:
功能添加:
push rbp
mov rbp, rsp
mov DWORD PTR[rbp-0x14], edi ;store first
mov DWORD PTR[rbp-0x18], esi ;store second
mov edx, DWORD PTR[rbp-0x14]
mov eax, DWORD PTR[rbp-0x18]
add eax, esx
mov DWORD PTR[rbp-0x4], eax
nop
pop rbp
ret
Run Code Online (Sandbox Code Playgroud)
主要功能:
push …Run Code Online (Sandbox Code Playgroud)