C语言第一次培训笔记
目录
一、C程序的基本代码框架
#include <stdio.h>
int main()
{
printf("hello world\n");
return 0;
}
#include <stdio.h>:引入标准输入输出库,使用printf和scanf时需要它main:程序开始执行的函数,可以把它理解为程序入口{}:表示代码块return 0;:表示程序正常结束- 每条语句通常以分号
;结束
二、注释
C语言有两种注释方法:
// 单行注释
/*
多行注释
一般在自行定义的函数前有使用多行注释详细说明函数作用
*/
/* 这个注释也可以在同一行中 */
二、基本数据类型
1. 常用类型
| 类型 | 大小(字节) | 范围 | 格式符 |
|---|---|---|---|
char | 1 | -128 到 127 | %c |
unsigned char | 1 | 0 到 255 | %c |
int | 4 | -2,147,483,648 到 2,147,483,647 | %d |
unsigned int | 4 | 0 到 4,294,967,295 | %u |
short | 2 | -32,768 到 32,767 | %hd |
long | 8 | 很大的范围 | %ld |
float | 4 | 6位精度 | %f |
double | 8 | 15位精度 | %lf |
补充说明:具体字节数与编译环境有关。可以用 sizeof 查看大小:
#include <stdio.h>
int main(void)
{
printf("int: %zu bytes\n", sizeof(int));
printf("float: %zu bytes\n", sizeof(float));
printf("double: %zu bytes\n", sizeof(double));
printf("char: %zu byte\n", sizeof(char));
return 0;
}
2. 位、字节、二进制和十六进制
- 1 个字节通常由 8 个位组成
- 二进制适合表示每一位的 0/1 状态
- 后续单片机中的寄存器等读写操作经常需要用位和位运算的概念
3. 变量、声明、初始化和赋值
int count; // 声明变量
int voltage = 5; // 声明并初始化
count = 10; // 赋值
count = count + 1;
- 声明:说明变量的类型和名字
- 初始化:变量第一次获得值
- 赋值:把一个新值放入已经存在的变量
- 变量的值可以改变,变量的类型通常在声明后不变
4. 类型转换
int a = 5;
int b = 2;
printf("%d\n", a / b); // 结果为 2
printf("%f\n", (float)a / b); // 结果为 2.500000
- 两个整数相除,结果仍按整数处理,小数部分会被舍去
- 需要小数结果时,应使用
float或double,或进行类型转换 - 变量超过可表示范围时可能发生溢出
三、变量的作用域和常量
1. 局部变量和全局变量
- 在函数外声明的是全局变量,作用范围较大
- 在函数内部声明的是局部变量,只能在相应代码块中使用
#include <stdio.h>
int global_value = 10;
int main(void)
{
int local_value = 5;
printf("%d %d\n", global_value, local_value);
return 0;
}
2. 常量
#define PI 3.1415926
const int MAX_VALUE = 1024;
#define是预处理阶段的文本替换const声明一个程序运行期间不应被修改的变量
四、输出和输入
1. printf
#include <stdio.h>
int main(void)
{
int count = 10;
float voltage = 3.3f;
char grade = 'A';
printf("count = %d\n", count);
printf("voltage = %.2f V\n", voltage);
printf("grade = %c\n", grade);
return 0;
}
常用格式说明符(占位符):
%d:int%c:char%f:输出浮点数%lld:long long%.2f:保留两位小数\n:换行
2. scanf
#include <stdio.h>
int main(void)
{
int a, b;
printf("请输入两个整数:");
scanf("%d %d", &a, &b);
printf("和为:%d\n", a + b);
return 0;
}
scanf用于从输入中读取数据&a表示取得变量a的地址;本次先记住这种写法,指针会在后续课程详细解释- 输入格式符必须与变量类型相匹配
五、运算符
1. 算术运算符
+、-、*、/、%
int a = 7;
int b = 3;
printf("%d\n", a + b);
printf("%d\n", a - b);
printf("%d\n", a * b);
printf("%d\n", a / b);
printf("%d\n", a % b); // 求余数
2. 关系运算符
>、<、>=、<=、==、!=
- 结果为真或假(用0来表示假,非0表示真)
- 特别提醒:
==用于比较,=用于赋值。
3. 逻辑运算符
&&(并且)、||(或者)、!(取反)
4. 自增、自减和复合赋值
++、--、+=、-=、*=、/=
++a 和 a++ 都会让 a 增加 1,但返回值不同:
++a:先自增,再使用新值(前置自增)a++:先使用原值,再自增(后置自增)
a += 1 : a = a + 1
a -= 1 : a = a - 1
5. 运算优先级
表达式较复杂时使用括号明确意图:
int result = (a + b) * c;
六、分支结构
导入:
在了解分支结构之前,我们需要了解一下什么是顺序结构
- 顺序结构的特点:==从上往下依次执行==,这也是程序默认的执行过程。
#include <stdio.h>
int main()
{
int a;
scanf("%d", &a); // <-如果没有输入,则程序就会卡在这里
/* 其他代码 */
return 0;
}
分支结构的特点:
- 从上往下依次判断
- 只要有一个判断成立,则就执行对应的语句体
- 如果都不成立,就执行else里面的语句体
1. if
if(判断条件)
{
/* 满足条件执行程序 */
}
// 如果所执行的程序只有一行,我们可以这么写:
if(判断条件) /* 满足条件执行的程序 */
if (voltage > 5.0)
{
printf("电压偏高\n");
}
2. if - else
if (voltage > 5.0)
{
printf("电压偏高\n");
}
else
{
printf("电压可接受\n");
}
3. 多分支判断

C语言使用 else if 表示多个条件:
if(关系语句A)
{
满足A执行的程序
}
else if(关系语句B)
{
满足B执行的程序
}
else if(关系语句C)
{
满足C执行的程序
}
......
else
{
满足N所执行的程序
}
if (score >= 90)
{
printf("优秀\n");
}
else if (score >= 60)
{
printf("及格\n");
}
else
{
printf("需要继续学习\n");
}
4. switch

switch (表达式)
{
case 值1:
语句体1;
break;
case 值2:
语句体2;
break;
case 值3:
语句体3;
break;
.....
default:
未匹配的语句体;
break;
}
switch适合判断一个变量的多个固定值break用于结束当前分支,避免继续执行后面的分支default处理未匹配的情况,这个是可选的case整型常量或字符常量
七、循环语句
1. for
- 适合循环次数较明确的情况
for(判断变量初始化; 判断条件; 变量更新)
{
循环体;
}
int n;
printf("输出次数:");
scanf("%d", &n);
for (int i = 0; i < n; i++)
{
printf("第 %d 次输出\n", i + 1);
}
循环嵌套:
printf("九九乘法表\n");
for(int i = 1; i<= 9; i++)
{
for(int j = 1; j<=i; j++)
{
printf("%d*%d=%d\t", j, i, i*j);
}
printf("\n");
}
2. while
- 适合用在不知道循环的次数和范围,只知道循环的结束条件

while(条件判断语句)
{
循环体语句;
变量更新;
}
int count = 0;
while (count < 5)
{
printf("count = %d\n", count);
count ++;
}
- 适用于未知循环次数,但知道循环条件的情况:比如质数的寻找、字符串的遍历
3. do - while
int value;
do
{
printf("请输入一个正数:");
scanf("%d", &value);
}
while (value > 0);
- 循环体至少执行一次
- 先执行再判断条件
4. break 和 continue
break:立即结束整个循环continue:跳过本次循环剩余部分,进入下一次循环
常见报错
- 漏写分号:
expected ';' - 字符串没有使用英文双引号
" - 字符没有使用英文单引号
' - 使用了未声明的变量
- 一直没有输出:可能卡死在某个循环中无法
说明: 1. 阅读报错时,先看报错所在的行号,再看报错信息,最后结合上一行检查括号和分号。报错行有时只是编译器发现问题的位置,真正原因可能在前一行。 2. 遇到不懂的问题可以将报错信息问学长学姐或者去自行搜索(AI或者浏览器搜索) 3. 遇到错误一定要记得记录,无论是C语言还是后面的单片机语言都要养成记录错误的习惯