第 1 章 环境与程序结构

1.1 开发环境:Dev-C++

Dev-C++ 是一款轻量快捷的 C/C++ 集成开发环境。以下是核心操作快捷键:

操作 快捷键 说明
编译 F9 检查语法,生成 .o 目标文件
运行 F10 直接运行已编译的程序
编译并运行 F11 最常用:一键完成编译+运行
启动调试 F5 运行到第一个断点处暂停
单步执行(跳过函数) F7 逐行执行,遇到函数调用整体跳过
单步执行(进入函数) F8 逐行执行,遇到函数调用进入内部
停止调试 F6 结束调试模式

调试流程: 代码行号处点击设置断点(变红)→ F5 启动 → 程序在断点暂停 → 右键变量选"添加查看"观察值 → F7 逐行走 → F6 结束。

1.2 C 程序的基本结构

一个 C 程序由以下几个部分组成:

#include <stdio.h>      // 预处理命令:引入头文件
int count = 0;          // 全局变量声明

/* 函数声明(原型) */
int max(int a, int b);

int main(void) {         // 主函数:程序唯一入口
    printf("Hello!\n");
    return 0;            // 返回 0 表示正常退出
}

int max(int a, int b) {  // 函数定义
    return a > b ? a : b;
}
  • 每个 .c 文件由预处理命令、全局声明、函数定义和注释组成
  • 有且只有一个 main 函数,程序从这里开始执行
  • 函数由首部(返回类型 + 函数名 + 参数列表)和函数体({} 内)组成
  • 语句以分号 ; 结尾;空格、换行、Tab 不影响语法,只影响可读性

注释写法:

// 这是单行注释
/* 这是多行注释
   可以跨越多行 */

⚠️ /* */ 不能嵌套。/* 外层 /* 内层 */ 这里结束,后面的 */ 会报错。

1.3 编译四阶段

C 源代码从文本变成可执行文件,经历四个阶段:

阶段 输入 输出 做了什么
预处理 .c .i 展开 #include#define,处理条件编译
编译 .i .s 语法检查,生成汇编代码
汇编 .s .o 汇编转机器码(目标文件)
链接 .o + 库 可执行文件 合并目标文件,解析函数引用

Linux/gcc 逐步编译命令:

gcc -E hello.c -o hello.i          // 仅预处理
gcc -S hello.i -o hello.s          // 预处理+编译
gcc -c hello.s -o hello.o          // 汇编
gcc hello.o -o hello               // 链接,生成可执行文件

// 一步完成:
gcc hello.c -o hello -Wall         // -Wall 开启所有警告(推荐)

1.4 头文件与标准库

头文件的本质是文本替换:编译器把 #include <stdio.h> 替换为 stdio.h 文件的全部内容,然后再编译。

🆚 辨析: <>"" 的区别

  • #include <stdio.h> → 只在系统目录中搜索(标准库用这种)
  • #include "myfile.h" → 先搜当前目录,找不到再搜系统目录(自己写的头文件用这种)

常用标准头文件:

常见使用场景使用案例1.6附录

头文件 提供的功能
stdio.h printf、scanf、gets、puts、fgets、sprintf、sscanf
stdlib.h atoi、atof、rand、srand、exit、malloc、free
string.h strlen、strcpy、strcat、strcmp、strstr、strchr
math.h sqrt、pow、fabs、ceil、floor、round
ctype.h isdigit、isalpha、isupper、islower、toupper、tolower
time.h time、clock(常配合 rand 使用)
conio.h getch、putch(非标准,仅 Windows)

⚠️ math.h 中的函数在 Linux 下编译时需要加 -lm 链接数学库:gcc hello.c -lm -o hello

1.5 main 函数的标准写法

int main(void)            // 不接收命令行参数
int main(int argc, char *argv[])  // 接收命令行参数
// argc:参数个数(至少为 1,第 0 个是程序名)
// argv:参数字符串数组

⚠️ void main() 不是标准写法。部分编译器容忍,但严格来说是错误的。始终用 int main(),并 return 0

1.6 附录 (高频使用命令附录)

以下是常用标准库函数的精简语法与示例:

// stdio.h - 标准输入输出
printf("Hello, %s!\n", "World");          // 格式化输出
scanf("%d", &num);                        // 格式化输入
fgets(buffer, sizeof(buffer), stdin);      // 安全读取一行字符串
puts("Hello");                            // 输出字符串并换行
sprintf(buf, "%d", 123);                  // 格式化字符串到缓冲区
sscanf(buf, "%d", &num);                  // 从字符串格式化读取

// stdlib.h - 通用工具
int val = atoi("123");                     // 字符串转整数
double dval = atof("3.14");               // 字符串转浮点数
int* arr = (int*)malloc(10 * sizeof(int)); // 动态内存分配
free(arr);                                 // 释放动态内存
srand(time(NULL));                         // 设置随机种子
int r = rand() % 100;                      // 生成0-99随机数
exit(0);                                   // 正常退出程序

// string.h - 字符串操作
size_t len = strlen("hello");              // 获取字符串长度
strcpy(dest, src);                         // 复制字符串
strcat(dest, " suffix");                  // 拼接字符串
int cmp = strcmp(str1, str2);              // 比较字符串
char* pos = strstr(haystack, needle);      // 查找子串
char* ch = strchr(str, 'a');               // 查找字符

// math.h - 数学函数
double root = sqrt(16.0);                  // 平方根
double power = pow(2.0, 10.0);             // 幂运算
double abs_val = fabs(-3.5);               // 浮点绝对值
double up = ceil(3.2);                     // 向上取整
double down = floor(-2.7);                 // 向下取整
double rounded = round(4.5);               // 四舍五入

// ctype.h - 字符分类与转换
if (isdigit('5')) { /* 是数字 */ }         // 检查数字字符
if (isalpha('A')) { /* 是字母 */ }         // 检查字母字符
if (isupper('Z')) { /* 是大写 */ }         // 检查大写字母
if (islower('z')) { /* 是小写 */ }         // 检查小写字母
char upper = toupper('a');                 // 转大写
char lower = tolower('B');                 // 转小写

// time.h - 时间处理
time_t now = time(NULL);                   // 获取当前时间戳
clock_t start = clock();                   // 记录开始时间
// ... 执行代码 ...
clock_t end = clock();                     // 记录结束时间
double cpu_time = (end - start) * 1.0 / CLOCKS_PER_SEC; // 计算CPU时间

// conio.h - 控制台输入输出 (仅Windows)
// char c = getch();                       // 无回显读取单字符
// putch('*');                             // 输出单个字符

注意:

  1. gets() 函数已废弃,请使用 fgets() 替代。
  2. scanf() 后注意清理输入缓冲区中的换行符残留。
  3. malloc() 后必须检查返回值是否为 NULL
  4. rand() 使用前需用 srand() 播种。
  5. Linux/macOS 下编译含 math.h 的程序需添加 -lm 链接选项。
  6. conio.h 不是C标准库,仅在Windows环境下可用。
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐