第一个C程序 - Hello World #

一、编写第一个程序 #

1.1 创建源文件 #

创建一个名为 hello.c 的文件:

c
#include <stdio.h>

int main() {
    printf("Hello, World!\n");
    return 0;
}

1.2 编译程序 #

打开终端,进入文件所在目录,执行编译命令:

bash
gcc hello.c -o hello

编译成功后,会生成 hello 可执行文件(Windows下是 hello.exe)。

1.3 运行程序 #

Linux/Mac:

bash
./hello

Windows:

cmd
hello.exe

输出结果:

text
Hello, World!

二、程序结构解析 #

让我们详细分析这个简单的程序:

c
#include <stdio.h>

int main() {
    printf("Hello, World!\n");
    return 0;
}

2.1 预处理指令 #

c
#include <stdio.h>
  • #include 是预处理指令,用于包含头文件
  • <stdio.h> 是标准输入输出头文件
  • 包含后可以使用 printf 等函数

2.2 main函数 #

c
int main() {
    return 0;
}
  • main 是程序入口函数
  • int 表示返回整数类型
  • return 0 表示程序正常结束

2.3 输出语句 #

c
printf("Hello, World!\n");
  • printf 是格式化输出函数
  • \n 是换行符
  • 每条语句以分号 ; 结尾

三、编译过程详解 #

3.1 四个阶段 #

text
源代码(.c)
    ↓ 预处理
预处理文件(.i)
    ↓ 编译
汇编代码(.s)
    ↓ 汇编
目标文件(.o)
    ↓ 链接
可执行文件

3.2 查看各阶段 #

预处理阶段:

bash
gcc -E hello.c -o hello.i

生成 hello.i 文件,展开所有 #include#define

编译阶段:

bash
gcc -S hello.c -o hello.s

生成 hello.s 汇编文件:

asm
    .file   "hello.c"
    .text
    .section    .rodata
.LC0:
    .string "Hello, World"
    .text
    .globl  main
    .type   main, @function
main:
    pushq   %rbp
    movq    %rsp, %rbp
    ...

汇编阶段:

bash
gcc -c hello.c -o hello.o

生成 hello.o 目标文件(二进制)。

链接阶段:

bash
gcc hello.o -o hello

链接库函数,生成可执行文件。

3.3 一步编译 #

bash
gcc hello.c -o hello

这条命令自动完成所有阶段。

四、程序入口 - main函数 #

4.1 main函数形式 #

标准形式:

c
int main(void) {
    return 0;
}

带参数形式:

c
int main(int argc, char *argv[]) {
    return 0;
}

4.2 返回值 #

  • return 0 表示程序成功执行
  • return 非零值 表示程序出错

查看返回值:

bash
./hello
echo $?

输出:

text
Hello, World!
0

4.3 命令行参数 #

c
#include <stdio.h>

int main(int argc, char *argv[]) {
    printf("参数个数: %d\n", argc);
    for (int i = 0; i < argc; i++) {
        printf("参数%d: %s\n", i, argv[i]);
    }
    return 0;
}

编译运行:

bash
gcc args.c -o args
./args hello world 123

输出:

text
参数个数: 4
参数0: ./args
参数1: hello
参数2: world
参数3: 123

五、输出函数详解 #

5.1 printf函数 #

c
int printf(const char *format, ...);

返回值是输出的字符数。

c
#include <stdio.h>

int main() {
    int count = printf("Hello, World!\n");
    printf("输出了 %d 个字符\n", count);
    return 0;
}

5.2 格式化输出 #

c
#include <stdio.h>

int main() {
    int age = 25;
    float height = 1.75;
    char grade = 'A';
    char name[] = "张三";
    
    printf("姓名: %s\n", name);
    printf("年龄: %d\n", age);
    printf("身高: %.2f米\n", height);
    printf("等级: %c\n", grade);
    
    return 0;
}

常用格式符:

格式符 说明 示例
%d 有符号整数 123
%u 无符号整数 123
%f 浮点数 3.14
%.2f 保留2位小数 3.14
%c 字符 ‘A’
%s 字符串 “hello”
%p 指针地址 0x7fff…
%x 十六进制 ff
%o 八进制 377
%% 百分号 %

5.3 转义字符 #

转义字符 说明
\n 换行
\t 制表符
\r 回车
\ 反斜杠
' 单引号
" 双引号
\0 空字符

示例:

c
printf("第一行\n第二行\n");
printf("姓名:\t张三\n");
printf("路径: C:\\Users\\test\n");
printf("他说: \"你好\"\n");

六、输入函数 #

6.1 scanf函数 #

c
#include <stdio.h>

int main() {
    int age;
    printf("请输入年龄: ");
    scanf("%d", &age);
    printf("你的年龄是: %d\n", age);
    return 0;
}

注意:scanf 需要变量的地址,使用 & 取地址符。

6.2 读取多个值 #

c
#include <stdio.h>

int main() {
    int a, b;
    printf("请输入两个整数: ");
    scanf("%d %d", &a, &b);
    printf("a + b = %d\n", a + b);
    return 0;
}

6.3 读取字符串 #

c
#include <stdio.h>

int main() {
    char name[50];
    printf("请输入姓名: ");
    scanf("%s", name);
    printf("你好, %s!\n", name);
    return 0;
}

注意:scanf 读取字符串时不需要 &,因为数组名就是地址。

6.4 fgets函数 #

scanf 不能读取带空格的字符串,使用 fgets

c
#include <stdio.h>

int main() {
    char name[50];
    printf("请输入姓名: ");
    fgets(name, 50, stdin);
    printf("你好, %s", name);
    return 0;
}

七、注释 #

7.1 单行注释 #

c
int a = 10;

7.2 多行注释 #

c
/*
 * 这是一个多行注释
 * 可以跨越多行
 */
int main() {
    return 0;
}

7.3 注释规范 #

c
/**
 * @brief 计算两个数的和
 * @param a 第一个数
 * @param b 第二个数
 * @return 两数之和
 */
int add(int a, int b) {
    return a + b;
}

八、常见错误 #

8.1 缺少分号 #

c
printf("Hello")  // 错误:缺少分号

错误信息:

text
error: expected ';' before 'return'

8.2 大小写错误 #

c
Printf("Hello");  // 错误:Printf应为printf

C语言区分大小写。

8.3 忘记头文件 #

c
int main() {
    printf("Hello");  // 错误:未包含stdio.h
    return 0;
}

8.4 main函数拼写错误 #

c
int Main() {  // 错误:Main应为main
    return 0;
}

8.5 忘记return #

c
int main() {
    printf("Hello\n");
    // 某些编译器会警告
}

虽然某些编译器允许,但建议加上 return 0;

九、编译选项 #

9.1 常用选项 #

bash
gcc -Wall hello.c -o hello
gcc -g hello.c -o hello
gcc -O2 hello.c -o hello
gcc -std=c11 hello.c -o hello
选项 说明
-o 指定输出文件名
-Wall 显示所有警告
-Wextra 额外警告
-g 生成调试信息
-O0 不优化
-O1 基本优化
-O2 标准优化
-O3 最大优化
-std=c11 使用C11标准

9.2 推荐编译方式 #

bash
gcc -Wall -Wextra -g -O0 -std=c11 hello.c -o hello

开发阶段使用 -g -O0,发布时使用 -O2

十、总结 #

编写C程序的步骤:

  1. 编写源代码(.c文件)
  2. 使用gcc编译成可执行文件
  3. 运行程序

程序结构:

部分 说明
#include 包含头文件
main() 程序入口
printf() 输出函数
return 0 返回状态

关键要点:

  • C语言区分大小写
  • 每条语句以分号结尾
  • main函数是程序入口
  • 使用#include包含头文件
  • 使用gcc编译程序

下一步,让我们学习C语言的基础语法!

最后更新:2026-03-26