第一个C程序
学习任何编程语言,传统都是从"Hello, World!"开始。这个程序虽然简单,却包含了 C 程序的基本结构:预处理指令、主函数、标准库调用和返回值。理解每一行的作用,是后续学习的基础。
Hello World 程序
#include <stdio.h>
int main(void)
{
printf("Hello, World!\n");
return 0;
}
将以上代码保存为 hello.c,编译运行:
gcc -std=c99 -o hello hello.c
./hello
输出:
Hello, World!
逐行解析
#include <stdio.h>
这是预处理指令,在编译之前由预处理器处理。#include 将指定头文件的内容插入到当前位置。<stdio.h> 是标准输入输出头文件(standard input/output),包含了 printf 等函数的声明。没有这一行,编译器不知道 printf 是什么,会报"隐式声明函数"的警告或错误。
尖括号 < > 表示从系统头文件路径搜索;双引号 " " 表示先从当前目录搜索,再搜索系统路径。标准头文件用尖括号,自定义头文件用双引号。
int main(void)
这是主函数的定义,每个 C 程序必须有且仅有一个 main 函数,程序从这里开始执行。
int表示函数返回一个整数main是函数名,固定不变(void)表示函数不接受参数(C99 推荐显式写void,空括号在 C 中表示参数未指定)
C99 标准允许两种 main 形式:
int main(void) /* 无参数 */
int main(int argc, char *argv[]) /* 接收命令行参数 */
其他形式(如 void main())不是标准 C,某些编译器可能接受,但不可移植。
{ ... }
花括号定义了一个代码块(复合语句),main 函数的函数体就是这个块。C 语言中,代码块可以嵌套,变量声明在块内时只在该块中有效。
printf("Hello, World!\n");
printf 是标准库中的格式化输出函数,将字符串打印到标准输出(通常是屏幕)。
"Hello, World!\n"是字符串字面量,\n是换行符- 每个语句以分号
;结束,分号是 C 语句的终止符
printf 支持格式控制,后续会详细讲解:
printf("Name: %s, Age: %d\n", "Alice", 25); /* %s 字符串,%d 整数 */
return 0;
return 语句结束函数执行,并将值返回给调用者。main 函数的返回值被操作系统接收,0 表示程序正常结束,非零值表示异常退出。
在 C99 之前,如果 main 末尾没有 return,行为未定义。C99 规定:如果 main 函数执行到末尾没有遇到 return,等效于 return 0;。但显式写 return 0; 是更好的习惯。
程序结构总结
一个最简单的 C 程序包含:
- 预处理指令:
#include、#define等,以#开头 - 函数定义:至少包含
main函数 - 语句:以分号结束,放在函数体内
- 注释:
/* ... */或// ...(C99),被编译器忽略
/* 文件:hello.c */
/* 这是一个多行注释,说明文件用途 */
#include <stdio.h> /* 包含标准输入输出头文件 */
/* main 函数:程序入口 */
int main(void)
{
// 打印问候语(单行注释)
printf("Hello, World!\n");
return 0; /* 正常结束 */
}
常见初学者错误
忘记分号:
printf("Hello\n") /* 错误:缺少分号 */
拼写错误:
printf("Hello\n"); /* 正确 */
print("Hello\n"); /* 错误:函数名拼错 */
引号不匹配:
printf("Hello\n'); /* 错误:开头双引号,结尾单引号 */
main 拼写错误:
int Main(void) /* 错误:C 区分大小写,必须是 main */
int mian(void) /* 错误:拼写错误 */
编译器会给出错误提示,仔细阅读错误信息并定位行号,是调试的第一步。