C语言基础语法
前言
相信你已经看完前面一节的内容了,如果还有不熟悉的地方,可以再去温故一下面向对象与面向过程,本节我将正式开始讲解关于C程序的内容,废话不多说,我们正式开始吧!
C语言基础语法
C 语言是一种通用的编程语言,广泛应用于系统编程、嵌入式开发和高性能计算等领域。
C 语言具有高效、灵活、可移植性强等特点,是许多其他编程语言的基础。
在 C 语言中,令牌(Token)是程序的基本组成单位,编译器通过对源代码进行词法分析,将代码分解成一个个的令牌。
C 语言的令牌主要包括以下几种类型:
关键字(Keywords)
标识符(Identifiers)
常量(Constants)
字符串字面量(String Literals)
运算符(Operators)
分隔符(Separators)
C程序的基本结构
让我们用更生活化的比喻和简单语言来解释 C 程序的结构
C 程序就像盖房子 🏠
想象你要盖一个房子(写程序),需要按步骤准备材料和组织工人。C 程序的结构可以这样理解:
1. 准备工具包(头文件包含)
1 |
- 就像盖房子需要先借电钻、锤子一样,
#include是告诉电脑:”我要用打印文字(printf)和读取输入(scanf)这些工具”。stdio.h就是存放这些工具的工具箱。
2. 贴便利贴(宏定义)
1 |
- 你可以在墙上贴一张便利贴写着”PI=3.14”,之后每次看到”PI”就直接替换成数字。
#define就是给常用的值起个简单名字,电脑会自动替换。
3. 设计图纸(函数声明)
1 | int add(int a, int b); // 提前告诉工人:"我要一个加法器" |
- 就像先告诉工人”我要一个能加两个数的机器”,但具体怎么造先不说。函数声明就是提前告诉电脑:”后面会有一个叫
add的函数,先记着它的样子”。
4. 大门入口(主函数)
1 | int main() { |
main()是程序的”大门”,电脑从这里开始执行。return 0;相当于最后说一句:”一切正常,结束啦!”
5. 准备材料(变量声明)
1 | int num1, num2, sum; // 准备三个盒子装数字 |
- 就像提前准备几个盒子(变量),贴上标签(变量名)用来存数字。在 C 语言中必须提前声明:”我要用这三个盒子装整数!”
6. 具体操作(语句和函数调用)
1 | printf("请输入两个数字:"); // 在屏幕上打印文字 |
- 这些就像具体的施工步骤:先贴告示让用户输入(
printf),然后接收用户输入的数字存到盒子里(scanf),最后用加法器计算(调用函数add)。
7. 建造机器(函数定义)
1 | int add(int a, int b) { |
- 这里是真正建造加法器的地方。当
add被调用时,它会把两个数相加,然后”吐”出结果。
举个完整例子 🌰
1 |
|
程序运行效果:
1 | Hello! |
关键点总结 🔑
- 工具包在前:所有
#include和#define要写在最前面 - 入口不能少:每个程序必须有
main()函数 - 先声明后使用:函数和变量都要先告诉电脑它们的存在
- 语句像步骤:一行行代码就像做菜的步骤,按顺序执行
- 函数像机器:先设计机器图纸(声明),再具体建造(定义)
就像盖房子需要先备料再施工一样,C 程序的结构就是一步步告诉电脑该做什么。刚开始可能觉得步骤繁琐,但熟悉后会发现这是为了保证程序清晰可靠!
分隔符
咱们可以把编程里的”分隔符”想象成写作文时用的标点符号,它们的作用就是让代码更有条理、更容易读懂。下面用最生活化的方式解释:
逗号(,)——像购物清单的分隔符
- 比如你写购物清单:”苹果、香蕉、牛奶”,逗号就像中间的顿号,用来分开多个东西。
- 编程中用它分隔变量或函数参数:
1
2int 身高 = 180, 体重 = 70; // 同时声明两个变量
printf("你好", name); // 分隔函数的两个参数
分号(;)——代码的句号
- 就像写句子结尾要打句号,写代码每句话结束必须加分号。
1
2printf("我写完代码啦!"); // 这句结束了,打上分号
return 0; // 这句也结束了,再打个分号 - 甚至可以直接写个光杆分号,表示”这里啥也不干”:
1
; // 相当于对电脑说:"你先歇会儿,我暂时没指令"
- 就像写句子结尾要打句号,写代码每句话结束必须加分号。
括号三兄弟
圆括号 () —— 像数学公式里的括号
计算优先级/函数调用时用:1
2(3+5)*2 // 先算括号里的3+5
printf("你好") // 调用函数时必须带这对括号花括号 {} —— 代码的集装箱
把多行代码打包成一个整体,比如函数、循环、条件判断:1
2
3
4if (下雨了) {
拿伞();
关窗(); // 这两行代码被{}包裹成一组操作
}方括号 [] —— 储物柜编号
主要用来标记数组的位置:1
2int 成绩[3] = {90,85,95};
printf("%d",成绩[1]); // 取出第2个储物柜(下标从0开始)的值85
新手常见误区
- 漏加分号就像说话不喘气,计算机会懵:”你这句话到底结束没?”
- 括号不匹配就像只说了”大家好(今天天气真好”,计算机等着你补上另一半呢!
📝 注释——代码的便利贴
作用:用来在代码里写解释说明,但不会影响程序运行(就像看书时写在空白处的笔记,电脑会直接忽略它们)。
✏️ 两种注释写法
单行注释
//—— 便利贴- 适合写简短提醒,贴在某一行代码旁边:
1
2// 计算用户年龄(这个便利贴只占一行)
int age = 2023 - birthYear;
- 适合写简短提醒,贴在某一行代码旁边:
多行注释
/* */—— 笔记本上的补充说明- 当你想写大段解释,或者暂时屏蔽多行代码时用:
1
2
3
4
5
6
7/*
这个函数用来计算工资:
1. 获取基本工资
2. 加上奖金
3. 扣除税
*/
int salary = base + bonus - tax;
- 当你想写大段解释,或者暂时屏蔽多行代码时用:
🚧 使用禁忌(千万别踩坑!)
禁止套娃注释 ❌
- 不能在一个注释里再塞另一个注释,就像便利贴上不能再贴便利贴(会混乱):
1
2
3/* 外层注释
// 内层注释(错误!电脑会懵)
*/
- 不能在一个注释里再塞另一个注释,就像便利贴上不能再贴便利贴(会混乱):
别在”对话”中插注释 ❌
- 注释不能写在字符串(比如printf里的文字)中,就像聊天时突然说括号话会让人迷惑:
1
printf("你好啊 /* 这是注释吗? */"); // 电脑会原样输出整句话,包括/*
- 注释不能写在字符串(比如printf里的文字)中,就像聊天时突然说括号话会让人迷惑:
🌰 生活化例子
1 | // 单行注释:今天要买什么菜(电脑不会管这句) |
💡 为什么需要注释?
- 给未来的自己:一个月后回来看代码,可能完全忘记当时为啥这么写
- 给队友看:就像在代码里留”使用说明书”
- 临时禁用代码:调试时让某段代码暂时失效(像用胶带贴住不想用的部分)
1 | // printf("测试用,先屏蔽掉"); |
新手常见翻车现场 🚑
- 忘关多行注释:
/* 开头没写 */,结果后面代码全被当成注释! - 在字符串里手滑写
//:printf("网址://xxx.com");(电脑会正常输出,但你可能以为这是注释)
🏷️ 标识符——代码世界的起名规范
作用:用来给变量、函数、数组等起名字(比如你养的猫叫喵喵,代码里的数字可以叫年龄)。
📜 起名三大铁律
开头必须字母或下划线
- ❌ 禁止数字打头(像手机号不能当人名):
1
2int 123abc; // 错误!数字开头
float _体重; // 正确√ 下划线开头
- ❌ 禁止数字打头(像手机号不能当人名):
只能用字母、数字、下划线
- ❌ 禁用特殊符号(@、$、%等):
1
2char 邮箱@qq; // 错误!带了@
double $价格; // 错误!C语言不支持$(其他语言可能允许)
- ❌ 禁用特殊符号(@、$、%等):
严格区分大小写
- 就像
iPhone和iphone是两回事:1
2int Age = 18; // 全大写的Age
int age = 20; // 全小写的age(和上面是两个不同变量)
- 就像
🌰 生活化例子对比
| ✅ 合法名字 | ❌ 非法名字 | 错误原因 |
|---|---|---|
userName |
user-name |
中间有减号(只能用下划线_) |
_count |
3D模型 |
数字开头 |
price2023 |
价格$ |
包含$符号 |
isValid(驼峰命名) |
break |
用了C语言的关键字(后文解释) |
💡 起名技巧
见名知意:
- 烂名字 →
int a;(鬼知道a代表啥) - 好名字 →
int 学生年龄;(拼音或英文均可,推荐英文)
- 烂名字 →
风格统一:
- 小写+下划线:
student_age - 驼峰式:
studentAge
- 小写+下划线:
避开关键字:
- 别用C语言预留的单词(比如
int,return等),就像不能给孩子起名叫”人类”。
- 别用C语言预留的单词(比如
🤯 经典翻车现场
1 | int 1号学生 = 60; // 错误!数字开头 |
附:测试你理解的灵魂三问 🧐
- 能起名叫
_3D模型吗? → ✅ 可以(下划线开头+数字) UserName和username是同一个变量吗? → ❌ 不是(大小写敏感)支付宝到账$100能当变量名吗? → ❌ 不行(有$和中文,且C建议用英文)
📌 常量——像冰箱上的便利贴,贴完不能改
作用:定义固定不变的值(比如圆周率π=3.14),程序运行中禁止修改。
🌰 生活化例子
| 类型 | 例子 | 类比 |
|---|---|---|
| 整型常量 | const int 最大人数=100; |
教室最多容纳100人 |
| 浮点型常量 | const float 税率=0.05; |
商品统一加5%税 |
| 字符常量 | const char 换行='\n'; |
每次敲回车键的效果 |
| 字符串字面量 | char 问候[]="你好呀"; |
自动加隐形句号(\0) |
📢 重点提醒
- 字符串用双引号包裹,且末尾会悄悄加个
\0(像快递单号末尾的结束符) - 修改常量会报错(就像撕掉冰箱贴换数字会被家人骂)
1 | const float PI = 3.14; |
🧰 运算符——代码的多功能瑞士军刀
作用:对数据进行各种操作(计算、比较、判断等)
🔢 常见运算符分类
| 类型 | 运算符示例 | 生活类比 |
|---|---|---|
| 算术 | + - * / % |
加减乘除(%是求余数) |
| 关系 | > < == != |
比身高、称体重判断是否达标 |
| 逻辑 | && || ! |
多重条件(比如”雨天&&带伞”) |
| 赋值 | = += -= |
快捷操作(钱包+=100 就是加钱) |
| 位运算 | & | ^ ~ |
二进制开关操作(像电路板) |
🌰 代码场景演示
1 | int 钱包 = 50; |
🚧 避坑指南
字符串忘记\0
1
2char 错误写法[3] = {'A','B','C'}; // ❌ 缺少\0,打印可能乱码
char 正确写法[] = "ABC"; // ✅ 自动补\0混淆=和==
1
2if (身高 = 180) { ... } // ❌ 其实是赋值,永远为真
if (身高 == 180) { ... } // ✅ 比较是否等于180整数除法陷阱
1
2float 结果 = 5 / 2; // ❌ 得到2而不是2.5
float 正确 = 5.0 / 2; // ✅ 得到2.5
🛠️ 运算符优先级口诀
先算乘除再加减,逻辑比关系优先,括号永远最牛逼!
记不住就加(),就像用便签明确优先级。
1 | int 迷惑计算 = 3 + 5 * 2; // 结果是13(先算5*2) |
附:测试你理解的灵魂三问 🧐
"Hello"[5]是什么? →\0(字符串结尾隐身保镖)10 % 3等于多少? → 1(10除以3余1)价格 *= 0.8;等价于? → 价格 = 价格 * 0.8(打8折)
🔑 关键字——编程界的「禁用词库」
作用:这些单词是C语言预留的特殊指令,就像「红灯」「出口」不能随便当人名用。
🗂️ 分类记忆法(重点掌握常用部分)
| 类别 | 关键字举例 | 生活比喻 |
|---|---|---|
| 数据类型 | int, char, float |
不同容器(水杯、饭盒、油桶) |
| 流程控制 | if, for, switch |
交通信号灯(停、转弯、直行) |
| 函数相关 | return, void |
快递签收(返回包裹/空手而归) |
| 存储方式 | static, extern |
物品存放位置(固定柜子/借隔壁东西) |
| 特殊操作 | sizeof, typedef |
工具尺(测量大小)和贴标签(起别名) |
🚫 绝对禁区示例
1 | int int = 5; // ❌ 用关键字int当变量名 → 就像给孩子取名"法律" |
📏 空格规则——代码的呼吸感
作用:让代码像排版优美的文章,既方便阅读,又能让编译器准确识别元素。
✅ 必须加空格的情况
- 关键字和变量名之间 → 像中英文混写要加空格
1
2int年龄 = 18; // ❌ 报错!连体婴写法
int 年龄 = 18; // ✅ 正确间距
🌟 推荐加空格提升可读性
1 | // 紧凑写法(合法但费眼) |
🚩 可灵活处理的场景
1 | price=100*2; // ✅ 合法但拥挤 |
💡 记忆技巧
关键字避雷口诀:
“改名叫int?立刻报错!
用switch当变量?电脑翻脸!”空格使用三字经:
关键字后必空格,运算符旁可加空,
长表达式分段空,就像呼吸要畅通。
🛠️ 代码美容院(对比案例)
丑代码 → 诊断报告
1 | int main(){int x=5;if(x>3){printf("大");}return 0;} |
症状:无空格导致阅读困难,像一段乱码
帅代码 → 优化方案
1 | int main() { |
疗效:层次分明,像排版精致的文档
附:测试你理解的灵魂三问 🧐
- 能写
float char = 3.14;吗? → ❌char是关键字 for(int i=0;;)中间可以不加空格吗? → ✅ 合法但建议加printf("hello");需要在哪里加空格? → 函数名和括号之间不需要(但参数内部按需加)


