C 语言的常见概念
目录
3. 补充:strlen 与 sizeof 的区别(新手常混淆)
✨ 引言:
为什么 C 语言是编程入门的 “黄金选择”?
很多新手纠结第一门编程语言学什么 ——Python 简单但离底层远,Java 笨重且概念多,而 C 语言恰好平衡了 “易上手” 和 “实用性”:它是编程界的 “地基语言”,Python、Java 的底层都有 C 语言的影子;学会 C 语言,能搞懂计算机的核心逻辑,后续学任何语言都事半功倍!
一、C 语言是什么?—— 人与计算机的 “沟通桥梁”
💡 本质:
C 语言是一种通用高级计算机语言,就像人类和计算机的 “翻译官”—— 我们用 C 语言写逻辑(比如 “打印文字”“计算 1+1”),编译器会把它翻译成计算机能懂的二进制指令,最终执行。
🌟 核心特点:
高效简洁(运行速度快,代码量少)、可移植性强(能在 Windows、Linux、Mac 上运行)、贴近硬件(能操作内存、寄存器,适合底层开发)。
🌍 应用场景:
不止是入门!操作系统(Unix、Linux)、嵌入式开发(单片机、智能硬件)、驱动程序、游戏引擎核心、工业控制等,都离不开 C 语言。
二、C 语言的历史:从 “工具” 到 “行业标准”
C 语言的诞生是一场 “为解决问题而生” 的迭代,用时间线梳理更清晰:
- 1967 年:BCPL 语言诞生(为系统编程设计,语法复杂);
- 1969 年:肯・汤普逊基于 BCPL 简化出 B 语言,用于编写 Unix 系统;
- 1972 年:丹尼斯・里奇在贝尔实验室优化 B 语言,补充数据类型、指针等特性,C 语言正式诞生;
- 1973 年:Unix 系统用 C 语言重写(原用汇编),C 语言凭借 “高效 + 易维护” 一战成名;
- 1989 年:ANSI 制定首个 C 语言标准(C89/C90),后续更新 C99、C11、C17,统一语法规则,让不同编译器(如 MSVC、GCC)都能兼容。
简单说:C 语言不是 “凭空造的”,而是为了解决实际开发问题不断优化的结果,实用性拉满!
三、编译器与 IDE:代码的 “转化器” 与 “工作台”
想让计算机看懂 C 语言,必须搞懂两个核心工具 —— 编译器(负责 “翻译”)和 IDE(负责 “一站式编写”),新手不用深钻原理,记住 “怎么用” 就行!
1. 编译型 vs 解释型语言(核心区别)
| 类型 | 代表语言 | 工作方式 | 优点 | 缺点 |
|---|---|---|---|---|
| 编译型 | C/C++ | 一次性编译成机器码,再运行 | 运行速度快,可独立运行 | 跨平台性稍弱(需重新编译) |
| 解释型 | Python | 逐行翻译逐行执行,无需提前编译 | 跨平台性好,上手快 | 运行速度慢 |
2. C 语言代码的 “变身” 流程(通俗版)
我们写的xxx.c(源文件)是 “人类能懂的文字”,计算机只认二进制,中间要经历 4 步:
xxx.c(源文件)→ 预处理(处理#define、#include)→ 编译(转汇编语言)→ 汇编(转二进制目标文件)→ 链接(合并系统库)→ xxx.exe(可执行程序)
✅ 新手不用记步骤:IDE 会自动完成 “编译 + 链接 + 运行”,你只需要写代码!
3. 新手必备工具推荐(避坑指南)
- 编译器:不用单独装!IDE 会自带:
- MSVC(微软):适配 VS2022,Windows 平台首选;
- GCC(GNU):跨平台、免费,适配 CodeBlocks;
- Clang(苹果):适配 XCode,Mac 平台专属。
- IDE(新手优先选这 3 个):
- VS2022(Windows):功能强、调试方便、自带中文,新手友好度拉满(推荐!);
- CodeBlocks(跨平台):轻量简洁,安装包小,适合电脑配置一般的用户;
- XCode(Mac):苹果专属,无需额外配置,适配 macOS/iOS 开发。
⚠️ 避坑提醒:
别装老旧的 DevC++!语法支持不全,调试功能弱,容易出现 “代码没问题但编译报错” 的情况。
四、VS2022 实操:写第一行 C 代码(手把手教学)
新手直接用 VS2022,步骤超详细,跟着做就能成功!
前置准备:VS2022 安装小提示
- 安装时勾选 “使用 C++ 的桌面开发”(默认会装 MSVC 编译器和必要组件);
- 安装路径选无中文、无特殊字符的文件夹(比如
D:\VS2022),避免后续报错。
第一步:创建新项目
- 打开 VS2022 → 点击 “创建新项目”;
- 搜索 “空项目”(C++ 类型,后续可写 C 代码)→ 点击 “下一步”;
- 项目名称填英文(如
FirstCProgram),路径选无中文的文件夹 → 点击 “创建”; - 打开 “视图”→ 勾选 “解决方案资源管理器”(后续管理文件要用)。
第二步:创建 C 源文件
- 右键 “源文件”→ 选择 “添加”→“新建项”;
- 点击 “显示所有模板”→ 选择 “C++ 文件 (.cpp)”→ 名称改成
test.c(后缀必须是.c,告诉编译器按 C 语言语法编译)→ 点击 “添加”。
第三步:写代码(打印 “hehe” 和 “呵呵”)
#define _CRT_SECURE_NO_WARNINGS 1 // 屏蔽VS的安全警告(比如scanf函数的警告)
#include <stdio.h> // 包含printf函数的头文件(必须加,否则报错)
int main() // 程序的入口函数,所有代码从这里开始执行
{
printf("hehe\n"); // 打印英文,\n是换行符(让后续内容换行显示)
printf("呵呵\n"); // 打印中文(VS默认编码支持中文,放心用)
return 0; // 程序正常结束的标志(返回0表示没问题)
}
💡 小技巧:按住 Ctrl 键,滑动鼠标滚轮可放大 / 缩小代码字体;代码写错时,VS 会用红色波浪线提示,鼠标悬停能看错误原因~
第四步:编译 + 运行(关键步骤)
- 快捷键:
Ctrl+F5(直接运行,控制台不会闪退,新手首选); - 若用
F5(调试运行),控制台可能一闪而过:在return 0;前加getchar();,就能保持控制台打开; - 运行成功后,控制台会显示:
hehe 呵呵
🎉 恭喜!你已经写出了第一行 C 语言代码,正式踏入编程大门~
常见问题排查
- 报错 “无法打开源文件 stdio.h”:安装 VS 时没勾选 “使用 C++ 的桌面开发”,重新运行安装程序补充组件;
- 中文乱码:打开源文件→ 点击 “文件”→“高级保存选项”→ 编码选 “GB2312”→ 保存。
五、main 函数:程序的 “唯一入口”
任何 C 程序都必须有main函数 —— 它就像家里的大门,程序从main函数开始执行,到return 0;结束,少了它就无法运行!
1. 结构拆解(一看就懂)
int main (void) // int:返回值类型(告诉系统程序执行结果是整数);main:函数名(固定,不能改);void:表示函数无参数
{
// 代码区:要执行的逻辑(比如打印、计算、判断)
return 0; // 0表示程序正常结束,非0表示异常(比如1表示出错)
}
2. ⚠️ 新手必避的 4 个致命错误(高频踩坑)
- 拼写错误:把
main写成mian(最容易犯!VS 会提示 “标识符未定义”); - 遗漏括号:
main后忘记加()(比如int main),编译器会认为是变量声明,直接报错; - 中文符号:用了中文分号
;、中文括号()(编译器只认英文符号,报错 “语法错误”); - 缺少分号:语句结束后没加
;(比如printf("hehe")),编译器会把下一行代码当成同一语句,报错。
3. main 函数的多种写法(规范 vs 不规范)
// 1. 早期写法(不推荐,C标准未定义,部分编译器兼容)
void main()
{
// 无返回值,执行完直接结束,移植性差
}
// 2. 不规范写法(非错误,但可读性差)
int main()
{
// 缺少return 0; C99及以后标准会隐式返回0,但不建议依赖
}
// 3. 推荐写法(兼容所有C标准,新手优先用)
int main(void) // 明确声明无参数,最严谨
{
return 0;
}
int main() // 省略void,日常开发常用,简洁高效
{
return 0;
}
int main(int argc, char* argv[]) // 带命令行参数(进阶用,比如接收控制台输入的参数)
{
return 0;
}
4. 注释快捷键(高效编程必备)
- 单行注释:选中代码→ 按
Ctrl+K+C(自动添加//); - 取消注释:选中代码→ 按
Ctrl+K+U; - 作用:注释后的代码不会执行,用来标注逻辑(比如
// 打印中文),方便自己和别人看懂代码。
六、printf 与库函数:C 语言的 “现成工具包”
printf是 C 语言最常用的函数 —— 用于在控制台打印内容,而它属于 “库函数”,就是 C 语言标准提供的 “现成工具”,不用我们自己写实现,直接用就行!
1. printf 的核心用法:格式化打印
语法:printf("格式控制字符串", 要打印的内容);
常用占位符(记牢!日常开发 80% 场景够用):
| 占位符 | 作用 | 示例代码 | 输出结果 |
|---|---|---|---|
%d | 打印整型(整数,正负都可) | printf("%d", 100); | 100 |
%c | 打印单个字符 | printf("%c", 'a'); | a |
%f | 打印浮点型(小数) | printf("%f", 3.14f); | 3.140000 |
%s | 打印字符串 | printf("%s", "Hello"); | Hello |
%.2f | 保留指定小数位数(这里是 2 位) | printf("%.2f", 3.1415); | 3.14 |
示例代码(包含多种用法):
#include <stdio.h>
int main()
{
printf("整数:%d\n", 100); // 打印整数
printf("字符:%c\n", 'w'); // 打印字符
printf("保留2位小数:%.2f\n", 3.1415); // 打印小数(控制精度)
printf("字符串:%s\n", "C语言入门"); // 打印字符串
return 0;
}
2. 头文件:库函数的 “使用说明书”
使用库函数必须先包含对应的头文件(.h后缀)
头文件里声明了函数的用法(比如printf的参数、返回值),告诉编译器 “这个函数怎么用”。
❌ 错误示例:
如果没写#include <stdio.h>,直接用printf会编译报错(提示 “标识符 printf 未定义”);
✅ 正确逻辑:
#include <stdio.h> → 告诉编译器 “我要用 printf 函数,说明书在这里” → 编译器正常识别。
常见库函数与对应头文件:
printf/scanf(输入输出)→stdio.h;strlen(计算字符串长度)→string.h;abs(求绝对值)→stdlib.h。
3. 库函数查询资源(权威推荐)
- 官网:cplusplus.com(英文,但详细,可查函数用法、示例);
- 中文:C 语言中文网(新手友好,有详细教程和函数说明)。
七、关键字(保留字):C 语言的 “专用词汇”
关键字是 C 语言预先定义的 “专用单词”,有固定含义,不能用作变量名、函数名(会冲突)。下面按功能分类整理,新手先记常用的,不用死记硬背!
1. 数据类型关键字(定义变量 / 数据类型)
int(整型)、short(短整型)、long(长整型)、float(单精度浮点型)、double(双精度浮点型)、char(字符型)、_Bool(布尔型,值为 1 真 / 0 假)、void(无类型)、signed(有符号,可表示正负)、unsigned(无符号,只能表示非负)。
2. 控制语句关键字(控制程序流程)
- 选择语句(判断):
if(如果)、else(否则)、switch(多分支)、case(分支条件)、default(默认分支)、break(跳出分支); - 循环语句(重复):
for、while、do; - 跳转语句(跳转):
goto(无条件跳转,不推荐滥用)、return(函数返回)。
3. 存储类关键字(控制变量存储方式)
static(延长变量生命周期、限制作用域)、
extern(声明外部变量 / 函数,跨文件使用)、
register(建议编译器将变量存入 CPU 寄存器,提高访问速度)、
auto(自动类型,变量默认类型,可省略)、
volatile(提醒编译器 “变量可能被意外修改”,不要优化)。
4. 其他常用关键字
sizeof(计算数据类型 / 变量的内存大小)、
const(定义常量,值不能修改)、
typedef(给数据类型重命名,比如typedef int INT;)、
struct(定义结构体,自定义复合数据类型)、
enum(枚举,一组命名的常量)。
💡 新手小技巧:
关键字在 VS 中会高亮显示(蓝色),如果你的变量名被高亮,大概率是和关键字冲突了(比如int int;会直接报错),换个名字就行!
八、字符与 ASCII 编码:字符的 “数字身份证”
计算机只认二进制,那字符(比如 'a'、'1'、'\n')怎么存储?
答案是ASCII 编码—— 给每个字符分配唯一的十进制数字(0-127),相当于字符的 “身份证号”,计算机存储的其实是这个数字的二进制。
1. 字符的表示方式
用单引号括起来(比如'a'、'5'、'\n'),和字符串(双引号)严格区分:
- 字符:
'a'(单个字符); - 字符串:
"a"(包含 'a' 和隐藏的\0,后续会讲)。
2. 必记 ASCII 值(新手背会这些,避免踩坑)
- 数字 0-9:48-57(比如
'0'的 ASCII 值是 48,'9'是 57 → 所以'5' + 3 = '8'); - 大写字母 A-Z:65-90(
'A'=65,'Z'=90); - 小写字母 a-z:97-122(
'a'=97,'z'=122); - 核心控制字符:
\n(换行)=10,\t(制表符)=9,\0(字符串结束标志)=0; - 空格字符:32(可打印,按空格键产生)。
3. 字符运算的本质(基于 ASCII 值)
字符的运算其实是它们的 ASCII 值在运算,比如大小写转换的核心逻辑:
#include <stdio.h>
int main()
{
printf("大写A转小写:%c\n", 'A' + 32); // 65+32=97 → 输出'a'
printf("小写a转大写:%c\n", 'a' - 32); // 97-65=32 → 输出'A'
printf("字符'5'转数字5:%d\n", '5' - 48); // 53-48=5 → 输出5
return 0;
}
4. 实操:打印可打印 ASCII 字符(32-127)
想直观看到 ASCII 编码对应的字符?运行这段代码,控制台会列出所有可打印字符:
#include <stdio.h>
int main()
{
int i = 0;
for (i = 32; i <= 127; i++)
{
printf("%c ", i); // 按ASCII值打印对应字符
if (i % 16 == 15) // 每16个字符换行,排版整齐
printf("\n");
}
return 0;
}
九、字符串与 \0:字符串的 “结束密码”
字符串是 “一串字符”,用双引号括起来(比如"abc"、"hello world"),但它的核心秘密是 —— 末尾隐藏着一个\0字符,这是字符串的 “结束标志”!
1. \0 的作用:告诉编译器 “到此为止”
"abc"在内存中实际存储为:a → b → c → \0(\0的 ASCII 值是 0,不显示,只负责 “终止”)。如果没有\0,编译器会一直向后读取内存中的随机数据,直到找到\0,导致打印乱码(比如 “abc 烫烫烫”)。
2. 不同初始化方式的差异(新手必看,易错点!)
#include <stdio.h>
#include <string.h> // 包含strlen函数(计算字符串长度)
int main()
{
char arr1[] = "abc"; // 正确:编译器自动在末尾加\0 → 存储为'a','b','c','\0'
char arr2[] = { 'a','b','c' }; // 易错:无\0 → 存储为'a','b','c'(不是完整字符串)
char arr3[] = { 'a','b','c','\0' }; // 正确:手动加\0,与arr1等价
printf("arr1:%s\n", arr1); // 输出abc(遇到\0停止)
printf("arr2:%s\n", arr2); // 输出abc+乱码(无\0,读取随机内存)
printf("arr3:%s\n", arr3); // 输出abc(正常终止)
printf("arr1长度:%d\n", strlen(arr1)); // 3(strlen统计\0前的字符数)
printf("arr2长度:%d\n", strlen(arr2)); // 随机值(无\0,无法确定长度)
return 0;
}
3. 补充:strlen 与 sizeof 的区别(新手常混淆)
很多新手会把 “字符串长度” 和 “数组占用内存” 搞混,用表格对比更清晰:
| 函数 / 操作符 | 功能 | 示例(char arr[] = "abc") | 结果 |
|---|---|---|---|
strlen | 统计字符串长度(\0 前的字符数) | strlen(arr) | 3 |
sizeof | 计算数组 / 变量占用的内存字节数 | sizeof(arr) | 4 |
4. 字符串的直接打印技巧
printf 打印字符串有两种方式,新手任选:
// 方式1:用%s占位符(推荐,适合变量)
char str[] = "C语言yyds";
printf("%s\n", str);
// 方式2:直接写双引号字符串(适合固定内容)
printf("C语言yyds\n");
十、转义字符:改变字符的 “原始含义”
转义字符以\开头,作用是 “改变后面字符的原始含义”—— 比如无法直接输入的换行、制表符,或者需要特殊表示的单引号、双引号(避免冲突)。
常用转义字符(带示例,记牢这 11 个!)
| 转义字符 | 作用 | 示例代码 | 输出结果 |
|---|---|---|---|
\n | 换行符(光标移到下一行开头) | printf("abc\ndef"); | abcdef |
\t | 制表符(相当于 Tab 键,对齐用) | printf("姓名\t年龄\t成绩"); | 姓名 年龄 成绩 |
\' | 表示单引号(解决嵌套冲突) | printf("他说:%c", '\''); | 他说:' |
\" | 表示双引号(解决嵌套冲突) | printf("书名:%s", "\"C语言入门\""); | 书名:"C 语言入门" |
\\ | 表示反斜杠(自身转义,文件路径常用) | printf("路径:C:\\test\\hehe.c"); | 路径:C:\test\hehe.c |
\? | 防止连续问号被解析为 “三字母词”(旧编译器兼容) | printf("Are you ok\?\?"); | Are you ok?? |
\a | 警报声(终端发声,无视觉输出) | printf("\a"); | 滴滴声(不同系统效果不同) |
\b | 退格符(光标左移一位,覆盖后续字符) | printf("abc\bd"); | abd(c 被覆盖) |
\r | 回车符(光标移到当前行开头,不换行) | printf("abc\r123"); | 123c(123 覆盖 ab) |
\ddd | 八进制转义(ddd=1-3 位八进制数) | printf("%c", '\130'); | X(八进制 130 = 十进制 88) |
\xdd | 十六进制转义(dd=1-2 位十六进制数) | printf("%c", '\x30'); | 0(十六进制 30 = 十进制 48) |
补充:\ddd 与 \xdd 深度解释
\ddd:后面跟 1-3 位八进制数字(0-7),编译器会将其转为十进制,作为 ASCII 码值对应的字符;- 示例:
\141(八进制 141 = 十进制 97)→'a',\0(八进制 0 = 十进制 0)→ 字符串结束标志; \xdd:后面跟 2 位十六进制数字(0-9、a-f、A-F),转为十进制后作为 ASCII 码值;- 示例:
\x61(十六进制 61 = 十进制 97)→'a',\x20(十六进制 20 = 十进制 32)→ 空格。
实操练习:计算字符串长度(易错点)
#include <stdio.h>
#include <string.h>
int main()
{
// 分析:\t是1个转义字符,\\是1个转义字符,\113是1个转义字符(八进制113=75→'K')
int len = strlen("c:\test\bit\113.c");
printf("%d\n", len); // 输出12(拆解:c : \test \bit \113 . c → 1+1+4+3+1+1=12)
return 0;
}
十一、语句分类:C 语言的 “句子规则”
C 语言的语句就像文章里的 “句子”,有固定格式和用途,按功能可分为 5 类,每类都有明确的使用场景:
1. 空语句:“占位用的空句子”
- 定义:单独一个分号就是空语句,没有实际执行逻辑。
- 用途:某个位置必须有语句,但暂时不需要做任何事时使用(比如循环中先占坑,后续补逻辑)。
- 代码示例:
int main()
{
;// 空语句:这里需要语句结构,但无需执行操作
for (int i = 0; i < 10; i++); // 循环体是空语句,仅让i自增10次
return 0;
}
⚠️ 易错点:不要无意识写空语句!比如if(1);{printf("hehe");},分号会让 if 只控制空语句,大括号里的代码会无条件执行。
2. 表达式语句:“带运算的句子”
- 定义:表达式后面加上分号,就构成表达式语句(最常用的语句类型)。
- 核心:表达式是 “有计算结果的式子”(比如
3+5、a=10),加了分号就变成可执行的语句。 - 代码示例:
int main()
{
3 + 5; // 表达式语句,但计算结果没用(无实际意义)
int a = 0; // 变量初始化语句(本质是赋值表达式+分号)
int b = 20;
b = a + 3; // 表达式语句:计算a+3,结果赋值给b
return 0;
}
3. 函数调用语句:“调用工具的句子”
- 定义:函数调用后面加上分号,用于执行函数的功能。
- 常见场景:printf、scanf、自定义函数调用等。
- 代码示例:
#include <stdio.h>
int main()
{
printf("hehe\n"); // 函数调用语句:执行打印功能
scanf("%d", &a); // 函数调用语句:执行读取输入功能
return 0;
}
4. 复合语句:“用大括号包裹的代码块”
- 定义:成对大括号
{}包裹的一组语句,也叫 “代码块”,会被视为一个整体。 - 用途:用于需要 “多条语句作为一个单元” 的场景(比如循环体、if 分支体)。
- 代码示例:
int main()
{
int i = 0;
int arr[10] = {0};
for (i = 0; i < 10; i++)
{
// 大括号内是复合语句(循环体),多条语句作为一个整体执行
arr[i] = 10 - i;
printf("%d\n", arr[i]);
}
return 0;
}
💡 小技巧:复合语句内可以定义局部变量,变量的作用域仅限于这个代码块(出了大括号就失效)。
5. 控制语句:“控制程序流程的句子”
- 核心:C 语言是 “结构化编程语言”,支持 3 种核心结构(顺序、选择、循环),控制语句就是实现这 3 种结构的关键。
- 分类(记牢!后续高频使用):
- 条件判断语句(选择结构):
if语句、switch语句; - 循环执行语句(循环结构):
do-while语句、while语句、for语句; - 转向语句(跳转控制):
break语句、goto语句、continue语句、return语句。
- 条件判断语句(选择结构):
十二、注释:代码的 “说明书”
注释是对代码的解释和说明,编译时会被编译器忽略,不参与执行,目的是让自己或他人看懂代码。
1. 两种注释方式(各有场景)
(1)单行注释:// 注释内容
- 用法:注释单行内容,从
//开始到行尾都算注释。 - 优势:简洁、支持 “多行单行注释”(本质是多个单行注释),日常开发首选。
- 代码示例:
int main()
{
int a = 10; // 单行注释:创建整型变量a,初始化值为10
// int b = 20; // 注释掉这条语句,编译时不执行
return 0;
}
(2)多行注释:/* 注释内容 */
- 用法:注释多行内容,从
/*开始,到*/结束,可跨行吗。 - 注意:不支持嵌套注释(内部再写
/*...*/会提前结束注释)。 - 代码示例:
/*
多行注释:
这是一个测试程序
功能:定义变量并赋值
*/
int main()
{
int a = 10;
/* int b = 20;
printf("%d", b); */ // 正确:单行内的多行注释
/* 注释1 /* 注释2 */ 错误:嵌套注释,注释2的*/会提前结束整个注释
return 0;
}
2. 注释的关键细节与规范
- 编译时,注释会被替换为一个空格,所以
min/*注释*/Value会变成min Value(不会报错)。 - 注释规范:
- 关键逻辑、复杂算法必须加注释(比如 “冒泡排序:从小到大排序数组”);
- 简单代码(如
int a=10;)可适当省略注释,避免 “过度注释”; - 注释要和代码对齐,保持整洁(比如在代码右侧加注释,缩进一致)。
📝 总结
这篇博客涵盖了 C 语言入门的 13 个核心知识点:从语言本质、工具使用,到 main 函数、库函数、字符编码、转义字符、语句规则,每个知识点都配了实操代码和易错点避雷。
学习 C 语言的关键是 “多写、多练、多踩坑”—— 不要怕报错,每一次报错都是一次进步!如果这篇博客对你有帮助,欢迎点赞、收藏!! 😉
1388





