You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何这段未正确定义int main()的C语言代码仍能正常运行?

为什么这段不符合常规语法的C语言代码能正常运行?

首先先把问题里的代码贴出来,方便大家理解:

#include <stdio.h> 
int main() 
struct books { 
    char title[50]; 
    char author[50]; 
    char sub[100]; 
    int b_id; 
}; 
//此处本该使用int main(),但代码仍能正常运行,这是为什么?
{ 
    struct books b1={"48lop","rg","sh",288017}; 
    printf("%s\n",b1.title); 
    printf("%s\n",b1.author); 
    printf("%s\n",b1.sub); 
    printf("%d",b1.b_id); 
    return 0; 
}

编译器的实际解读

你可能觉得这段代码结构混乱,但在遵循C89(ANSI C)标准的编译器眼里,它是被这样拆解的:

  • 首先包含stdio.h头文件,这部分完全合规
  • 第二行的int main()会被当作函数原型声明——告诉编译器:“存在一个返回int类型的main函数”,因为它后面没有紧跟函数体({}),所以不会被识别为函数定义
  • 接下来的struct books定义是全局作用域的合法代码,没有任何问题
  • 最后的{ ... }部分,被编译器识别为main函数的定义。在C89标准里,函数定义如果省略了返回类型,编译器会默认它返回int类型,刚好和前面的int main()声明匹配,所以整个函数的类型是一致的,能正常编译运行

现代C标准下的情况

这种写法在C99及之后的标准里是完全不合法的:

  • C99强制要求所有函数定义必须显式指定返回类型,再也不能依赖默认int的规则
  • 同时,main函数的声明和定义有更严格的语法要求,这种拆分式的写法会被编译器直接报错

规范的写法

实际开发中一定要遵循现代C标准,把代码改成正常的结构:

#include <stdio.h> 

struct books { 
    char title[50]; 
    char author[50]; 
    char sub[100]; 
    int b_id; 
}; 

int main() 
{ 
    struct books b1={"48lop","rg","sh",288017}; 
    printf("%s\n",b1.title); 
    printf("%s\n",b1.author); 
    printf("%s\n",b1.sub); 
    printf("%d",b1.b_id); 
    return 0; 
}

内容的提问来源于stack exchange,提问作者Chiranjit Debnath

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 17:32:48