前言

相信你已经看完前面一节的内容了,如果还有不熟悉的地方,可以再去温故一下面向对象与面向过程,本节我将正式开始讲解关于C程序的内容,废话不多说,我们正式开始吧!

C语言基础语法

C 语言是一种通用的编程语言,广泛应用于系统编程、嵌入式开发和高性能计算等领域。

C 语言具有高效、灵活、可移植性强等特点,是许多其他编程语言的基础。

在 C 语言中,令牌(Token)是程序的基本组成单位,编译器通过对源代码进行词法分析,将代码分解成一个个的令牌。

C 语言的令牌主要包括以下几种类型:

关键字(Keywords)
标识符(Identifiers)
常量(Constants)
字符串字面量(String Literals)
运算符(Operators)
分隔符(Separators)

C程序的基本结构

让我们用更生活化的比喻和简单语言来解释 C 程序的结构

C 程序就像盖房子 🏠

想象你要盖一个房子(写程序),需要按步骤准备材料和组织工人。C 程序的结构可以这样理解:

1. 准备工具包(头文件包含)

1
#include <stdio.h> // 相当于从仓库借工具
  • 就像盖房子需要先借电钻、锤子一样,#include 是告诉电脑:”我要用打印文字(printf)和读取输入(scanf)这些工具”。stdio.h 就是存放这些工具的工具箱。

2. 贴便利贴(宏定义)

1
#define PI 3.14159 // 相当于在墙上贴个便利贴
  • 你可以在墙上贴一张便利贴写着”PI=3.14”,之后每次看到”PI”就直接替换成数字。#define 就是给常用的值起个简单名字,电脑会自动替换。

3. 设计图纸(函数声明)

1
int add(int a, int b); // 提前告诉工人:"我要一个加法器"
  • 就像先告诉工人”我要一个能加两个数的机器”,但具体怎么造先不说。函数声明就是提前告诉电脑:”后面会有一个叫add的函数,先记着它的样子”。

4. 大门入口(主函数)

1
2
3
4
int main() { 
// 这里写程序的主要动作
return 0; // 最后交钥匙表示完工
}
  • main() 是程序的”大门”,电脑从这里开始执行。return 0; 相当于最后说一句:”一切正常,结束啦!”

5. 准备材料(变量声明)

1
int num1, num2, sum; // 准备三个盒子装数字
  • 就像提前准备几个盒子(变量),贴上标签(变量名)用来存数字。在 C 语言中必须提前声明:”我要用这三个盒子装整数!”

6. 具体操作(语句和函数调用)

1
2
3
printf("请输入两个数字:"); // 在屏幕上打印文字
scanf("%d %d", &num1, &num2); // 读取用户输入的数字
sum = add(num1, num2); // 调用加法器计算结果
  • 这些就像具体的施工步骤:先贴告示让用户输入(printf),然后接收用户输入的数字存到盒子里(scanf),最后用加法器计算(调用函数add)。

7. 建造机器(函数定义)

1
2
3
int add(int a, int b) { 
return a + b; // 机器的内部构造:两数相加
}
  • 这里是真正建造加法器的地方。当add被调用时,它会把两个数相加,然后”吐”出结果。

举个完整例子 🌰

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>      // 工具包:借来打印和输入工具
#define GREETING "你好呀!" // 贴个便利贴:把GREETING替换成"你好呀!"

void sayHello(); // 提前声明:"我要一个打招呼的机器"

int main() {
sayHello(); // 使用打招呼机器
printf("%s\n", GREETING); // 打印便利贴内容
return 0; // 交钥匙结束
}

void sayHello() { // 建造打招呼机器
printf("Hello!\n");
}

程序运行效果:

1
2
Hello!
你好呀!

关键点总结 🔑

  1. 工具包在前:所有#include#define要写在最前面
  2. 入口不能少:每个程序必须有main()函数
  3. 先声明后使用:函数和变量都要先告诉电脑它们的存在
  4. 语句像步骤:一行行代码就像做菜的步骤,按顺序执行
  5. 函数像机器:先设计机器图纸(声明),再具体建造(定义)

就像盖房子需要先备料再施工一样,C 程序的结构就是一步步告诉电脑该做什么。刚开始可能觉得步骤繁琐,但熟悉后会发现这是为了保证程序清晰可靠!

分隔符

咱们可以把编程里的”分隔符”想象成写作文时用的标点符号,它们的作用就是让代码更有条理、更容易读懂。下面用最生活化的方式解释:

  1. 逗号(,)——像购物清单的分隔符

    • 比如你写购物清单:”苹果、香蕉、牛奶”,逗号就像中间的顿号,用来分开多个东西。
    • 编程中用它分隔变量或函数参数:
      1
      2
      int 身高 = 180, 体重 = 70; // 同时声明两个变量
      printf("你好", name); // 分隔函数的两个参数
  2. 分号(;)——代码的句号

    • 就像写句子结尾要打句号,写代码每句话结束必须加分号。
      1
      2
      printf("我写完代码啦!"); // 这句结束了,打上分号
      return 0; // 这句也结束了,再打个分号
    • 甚至可以直接写个光杆分号,表示”这里啥也不干”:
      1
      ; // 相当于对电脑说:"你先歇会儿,我暂时没指令"
  3. 括号三兄弟

    • 圆括号 () —— 像数学公式里的括号
      计算优先级/函数调用时用:

      1
      2
      (3+5)*2       // 先算括号里的3+5
      printf("你好") // 调用函数时必须带这对括号
    • 花括号 {} —— 代码的集装箱
      把多行代码打包成一个整体,比如函数、循环、条件判断:

      1
      2
      3
      4
      if (下雨了) {
      拿伞();
      关窗(); // 这两行代码被{}包裹成一组操作
      }
    • 方括号 [] —— 储物柜编号
      主要用来标记数组的位置:

      1
      2
      int 成绩[3] = {90,85,95};
      printf("%d",成绩[1]); // 取出第2个储物柜(下标从0开始)的值85

新手常见误区

  • 漏加分号就像说话不喘气,计算机会懵:”你这句话到底结束没?”
  • 括号不匹配就像只说了”大家好(今天天气真好”,计算机等着你补上另一半呢!

📝 注释——代码的便利贴

作用:用来在代码里写解释说明,但不会影响程序运行(就像看书时写在空白处的笔记,电脑会直接忽略它们)。


✏️ 两种注释写法

  1. 单行注释 // —— 便利贴

    • 适合写简短提醒,贴在某一行代码旁边
      1
      2
      // 计算用户年龄(这个便利贴只占一行)
      int age = 2023 - birthYear;
  2. 多行注释 /* */ —— 笔记本上的补充说明

    • 当你想写大段解释,或者暂时屏蔽多行代码时用:
      1
      2
      3
      4
      5
      6
      7
      /* 
      这个函数用来计算工资:
      1. 获取基本工资
      2. 加上奖金
      3. 扣除税
      */
      int salary = base + bonus - tax;

🚧 使用禁忌(千万别踩坑!)

  1. 禁止套娃注释

    • 不能在一个注释里再塞另一个注释,就像便利贴上不能再贴便利贴(会混乱):
      1
      2
      3
      /* 外层注释 
      // 内层注释(错误!电脑会懵)
      */
  2. 别在”对话”中插注释

    • 注释不能写在字符串(比如printf里的文字)中,就像聊天时突然说括号话会让人迷惑:
      1
      printf("你好啊 /* 这是注释吗? */"); // 电脑会原样输出整句话,包括/*

🌰 生活化例子

1
2
3
4
5
6
7
8
9
10
// 单行注释:今天要买什么菜(电脑不会管这句)
int 土豆 = 3;

/*
多行注释:
1. 西红柿炒蛋的步骤:
2. 先炒鸡蛋
3. 再加西红柿
*/
int 西红柿 = 2;

💡 为什么需要注释?

  • 给未来的自己:一个月后回来看代码,可能完全忘记当时为啥这么写
  • 给队友看:就像在代码里留”使用说明书”
  • 临时禁用代码:调试时让某段代码暂时失效(像用胶带贴住不想用的部分)
1
2
// printf("测试用,先屏蔽掉"); 
printf("正式功能运行中...");

新手常见翻车现场 🚑

  • 忘关多行注释:/* 开头没写 */,结果后面代码全被当成注释!
  • 在字符串里手滑写//printf("网址://xxx.com");(电脑会正常输出,但你可能以为这是注释)

🏷️ 标识符——代码世界的起名规范

作用:用来给变量、函数、数组等起名字(比如你养的猫叫喵喵,代码里的数字可以叫年龄)。


📜 起名三大铁律

  1. 开头必须字母或下划线

    • ❌ 禁止数字打头(像手机号不能当人名):
      1
      2
      int 123abc;  // 错误!数字开头
      float _体重; // 正确√ 下划线开头
  2. 只能用字母、数字、下划线

    • ❌ 禁用特殊符号(@、$、%等):
      1
      2
      char 邮箱@qq; // 错误!带了@
      double $价格; // 错误!C语言不支持$(其他语言可能允许)
  3. 严格区分大小写

    • 就像iPhoneiphone是两回事:
      1
      2
      int Age = 18;  // 全大写的Age
      int age = 20; // 全小写的age(和上面是两个不同变量)

🌰 生活化例子对比

✅ 合法名字 ❌ 非法名字 错误原因
userName user-name 中间有减号(只能用下划线_
_count 3D模型 数字开头
price2023 价格$ 包含$符号
isValid(驼峰命名) break 用了C语言的关键字(后文解释)

💡 起名技巧

  1. 见名知意

    • 烂名字 → int a;(鬼知道a代表啥)
    • 好名字 → int 学生年龄;(拼音或英文均可,推荐英文)
  2. 风格统一

    • 小写+下划线:student_age
    • 驼峰式:studentAge
  3. 避开关键字

    • 别用C语言预留的单词(比如int, return等),就像不能给孩子起名叫”人类”。

🤯 经典翻车现场

1
2
3
int 1号学生 = 60;    // 错误!数字开头
float 体重#kg = 50.5; // 错误!带#号
char class = 'A'; // 错误!class是关键字

附:测试你理解的灵魂三问 🧐

  1. 能起名叫_3D模型吗? → ✅ 可以(下划线开头+数字)
  2. UserNameusername是同一个变量吗? → ❌ 不是(大小写敏感)
  3. 支付宝到账$100能当变量名吗? → ❌ 不行(有$和中文,且C建议用英文)

📌 常量——像冰箱上的便利贴,贴完不能改

作用:定义固定不变的值(比如圆周率π=3.14),程序运行中禁止修改。

🌰 生活化例子

类型 例子 类比
整型常量 const int 最大人数=100; 教室最多容纳100人
浮点型常量 const float 税率=0.05; 商品统一加5%税
字符常量 const char 换行='\n'; 每次敲回车键的效果
字符串字面量 char 问候[]="你好呀"; 自动加隐形句号(\0)

📢 重点提醒

  • 字符串用双引号包裹,且末尾会悄悄加个\0(像快递单号末尾的结束符)
  • 修改常量会报错(就像撕掉冰箱贴换数字会被家人骂)
1
2
const float PI = 3.14;
PI = 3.1415; // ❌ 错误!常量禁止修改

🧰 运算符——代码的多功能瑞士军刀

作用:对数据进行各种操作(计算、比较、判断等)

🔢 常见运算符分类

类型 运算符示例 生活类比
算术 + - * / % 加减乘除(%是求余数)
关系 > < == != 比身高、称体重判断是否达标
逻辑 && || ! 多重条件(比如”雨天&&带伞”)
赋值 = += -= 快捷操作(钱包+=100 就是加钱)
位运算 & | ^ ~ 二进制开关操作(像电路板)

🌰 代码场景演示

1
2
3
4
5
6
int 钱包 = 50;
钱包 += 20; // ✅ 钱包变成70(等价于 钱包 = 钱包 + 20)

if (温度 > 35 && 有空调) {
printf("开空调!");
} // 同时满足高温和有空调才执行

🚧 避坑指南

  1. 字符串忘记\0

    1
    2
    char 错误写法[3] = {'A','B','C'}; // ❌ 缺少\0,打印可能乱码
    char 正确写法[] = "ABC"; // ✅ 自动补\0
  2. 混淆=和==

    1
    2
    if (身高 = 180) { ... }  // ❌ 其实是赋值,永远为真
    if (身高 == 180) { ... } // ✅ 比较是否等于180
  3. 整数除法陷阱

    1
    2
    float 结果 = 5 / 2;    // ❌ 得到2而不是2.5
    float 正确 = 5.0 / 2; // ✅ 得到2.5

🛠️ 运算符优先级口诀

先算乘除再加减,逻辑比关系优先,括号永远最牛逼!
记不住就加(),就像用便签明确优先级。

1
2
int 迷惑计算 = 3 + 5 * 2;   // 结果是13(先算5*2)
int 明确计算 = (3 + 5) * 2; // 结果是16

附:测试你理解的灵魂三问 🧐

  1. "Hello"[5]是什么? → \0(字符串结尾隐身保镖)
  2. 10 % 3等于多少? → 1(10除以3余1)
  3. 价格 *= 0.8; 等价于? → 价格 = 价格 * 0.8(打8折)

🔑 关键字——编程界的「禁用词库」

作用:这些单词是C语言预留的特殊指令,就像「红灯」「出口」不能随便当人名用。

🗂️ 分类记忆法(重点掌握常用部分)

类别 关键字举例 生活比喻
数据类型 int, char, float 不同容器(水杯、饭盒、油桶)
流程控制 if, for, switch 交通信号灯(停、转弯、直行)
函数相关 return, void 快递签收(返回包裹/空手而归)
存储方式 static, extern 物品存放位置(固定柜子/借隔壁东西)
特殊操作 sizeof, typedef 工具尺(测量大小)和贴标签(起别名)

🚫 绝对禁区示例

1
2
int int = 5;      // ❌ 用关键字int当变量名 → 就像给孩子取名"法律"
char return = 'A'; // ❌ return是指令词 → 像用"红灯"当店名

📏 空格规则——代码的呼吸感

作用:让代码像排版优美的文章,既方便阅读,又能让编译器准确识别元素。

必须加空格的情况

  • 关键字和变量名之间 → 像中英文混写要加空格
    1
    2
    int年龄 = 18;   // ❌ 报错!连体婴写法
    int 年龄 = 18; // ✅ 正确间距

🌟 推荐加空格提升可读性

1
2
3
4
5
6
7
// 紧凑写法(合法但费眼)
for(int i=0;i<10;i++){...}

// 舒适写法(推荐!)
for (int i = 0; i < 10; i++) {
...
}

🚩 可灵活处理的场景

1
2
price=100*2;     // ✅ 合法但拥挤
price = 100 * 2; // ✅ 更易读(像数学公式空格)

💡 记忆技巧

  1. 关键字避雷口诀

    “改名叫int?立刻报错!
    用switch当变量?电脑翻脸!”

  2. 空格使用三字经

    关键字后必空格,运算符旁可加空,
    长表达式分段空,就像呼吸要畅通。


🛠️ 代码美容院(对比案例)

丑代码 → 诊断报告

1
int main(){int x=5;if(x>3){printf("大");}return 0;}

症状:无空格导致阅读困难,像一段乱码

帅代码 → 优化方案

1
2
3
4
5
6
7
int main() {
int x = 5;
if (x > 3) {
printf("大");
}
return 0;
}

疗效:层次分明,像排版精致的文档


附:测试你理解的灵魂三问 🧐

  1. 能写float char = 3.14;吗? → ❌ char是关键字
  2. for(int i=0;;)中间可以不加空格吗? → ✅ 合法但建议加
  3. printf("hello");需要在哪里加空格? → 函数名和括号之间不需要(但参数内部按需加)