C语言-Day 1
·
第 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('*'); // 输出单个字符
注意:
gets()函数已废弃,请使用fgets()替代。scanf()后注意清理输入缓冲区中的换行符残留。malloc()后必须检查返回值是否为NULL。rand()使用前需用srand()播种。- Linux/macOS 下编译含
math.h的程序需添加-lm链接选项。conio.h不是C标准库,仅在Windows环境下可用。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐
所有评论(0)