单片机入门基础——C语言程序设计
前言
本章作为蓝桥杯单片机基础学习储备,作者将把C语言的知识要点,学习心得以文章形式发表,也可用于普通本科C语言程序设计期末考考前速成或是了解C语言基础的入门文章。做到能看的明白到写的明白
本文参考:C 语言入门介绍 – C语言教程 – 菜鸟教程以及人民邮电出版社的《明解C语言(入门篇)》
C语言简介
C编程被认为是其他编程语言的基础。
C是一种功能强大的通用编程语言。它可以用于开发操作系统、数据库、编译器等软件。C编程是一门优秀的编程语言,适合初学者学习。
大家可以在VS code、VS2019/2022(各个版本)等各个环境中编译,使用万维全自动考试平台的同学们需要使用VC6.0适应考试环境。
一、程序结构与基础概念
1. 程序结构
顺序结构、选择(分支)结构、循环结构。
程序从 `main()` 函数开始执行,有且仅有一个 `main` 函数。
2. 数据存储与表示
数据以二进制形式存储,存放位置为地址。
位(bit)表示0或1;字节(byte)= 8位。
3. 编译与执行
预处理指令(如 `#define`)不属于C语言,不加分号。
编译流程:`.c` → `.obj` → `.exe`,仅 `.exe` 可执行。
4.注释
-
单行注释
#include<stdio.h> void main() { //printf("C语言好难"); printf("hahaha,C语言真简单"); }
上述代码仅输出hahaha,C语言真简单
-
多行注释
#include<stdio.h> void main() { /*printf("C语言好难"); printf("hahaha,C语言真简单"); */ printf("hahaha,C语言一点不简单"); }
上述代码输出hahaha,C语言一点不简单
二、标识符与关键字
标识符命名规则
-
有效的标识符可以包含字母(大写和小写字母),数字和下划线。
-
标识符的首字母应为字母或下划线。
-
您不能将关键字用作标识符。
-
标识符的长度没有指定。但是,如果标识符超过31个字符,则在某些编译器中可能会遇到问题。
如果遵循上述规则,则可以选择任何名称作为标识符,但是,建议有意义的标识符指定有意义的变量名称。
2. 常见错误
– 关键字不可作为用户标识符(如 `main` 是函数名,非关键字)。
常用关键字
三、数据类型与运算
1. 进制转换
十进制转换成二进制、八进制、十六进制。
二进制、八进制、十六进制转换成十进制。
2.数据类型
基本类型
void
void是空类型,一般用于函数的返回类型表示,表示该函数啥都不返回。
1.函数返回为空
2.函数参数为空
3.指针指向void
3. 运算符与表达式
算术运算:`/` 两边为整数时结果取整(`3/2=1`),含小数则结果为浮点(`3/2.0=1.5`);`%` 仅用于整数。
赋值运算:不可连续定义赋值(`int x=y=10;` 错误),但可分开赋值(`x=y=10;` 正确)。
自增/自减:`++a`(先加后用),`a++`(先用后加)。“-”同理
逗号表达式:值为最右侧表达式结果(如 `(2,3,4)` 的值为4)。
4.类型转换
(type)value;
//未使用
int num= 10/4;
printf("num=%d\n",num);//输出: 2
//使用
float f=(float) 9/4;
printf("f : %f\n", f );//输出: 2.250000
四、输入与输出
1.printf与 scanf
printf("a=%d, b=%d", 12, 34);
输出格式需与占位符严格匹配。
scanf` 需传递变量地址
scanf("%d", &x);
2. 格式说明符
//%d 整型
printf("%d", 123);
//%f 浮点型
printf("%5.2f", 3.1415);//输出 3.14
//%c 字符
printf("%c", 'A');//输出 A
//%s 字符串
printf("%s", "hello");//输出hello
//%o 八进制
printf("%o", 15);//输出17
//%x 十六进制
printf("%x", 255);//输出ff
%d 对应为 int
%f 对应为 float
%lf 对应为 double
%c 对应为 char
五、结构与基础
C语言是结构化的程序设计语言,这里的结构指的是顺序结构、选择结构、循环结构。
我们可以使用 if 、 switch 实现分支结构,使用 for 、 while 、 do while 实现循环结构。
分支语句
if语句
基本语法
例:输入一个整数,判断是否是偶数
int main()
{
int i = 0;
scanf("%d",&i);
if (i % 2 == 0)
printf("%d 是偶数\n",i);
return 0;
}
分支中包含多条语句要用{}
例:满18,成年,可以恋爱(输入年龄-判断成年—判断恋爱)
int main()
{
int age = 0;
scanf("%d", &age);
if (age < 18)
{
printf("未成年");
printf("不可以恋爱");
}
else
{
printf("成年");
printf("可以恋爱");
}
return 0;
}
嵌套if
例:判断一个整数是0 or 正整数 or 负整数
int main()
{
int i = 0;
scanf("%d",&i);
if (i == 0)
printf("该数字为0\n");
else if (i > 0)
printf("该数字为正整数\n");
else
printf("该数字为负整数\n");
return 0;
}
悬空else
else总是跟最近的if匹配
int main()
{
int a = 0;
int b = 2;
if (a == 1)
if (b == 2)
printf("hehe\n");
else
printf("haha\n");
return 0;
}
上方程序中,else与条件为(b == 2)的if语句匹配
int main()
{
int a = 0;
int b = 2;
if (a == 1)
{
if (b == 2)
printf("hehe\n");
}
else
printf("haha\n");
return 0;
}
上方程序中else与第一个if 匹配
关系操作符
关系表达式通常返回0或1表示真假
将变量写在等号右边可以避免一些错误
多个关系运算符不宜连用
条件操作符
例:使用条件操作符实现两个数中的较大值
int main()
{
int a = 0;
int b = 0;
scanf("%d,%d", &a, &b);
int max = a >= b ? a : b;
printf("%d\n", max);
return 0;
}
逻辑操作符
&&
可以理解为数学中的∩(A∩B),(A语句)&&(B语句),AB同时满足
||
可以理解为数学中的∪(A∪B),(A语句)||(B语句),二者满足其一即可
!逻辑取反
特点:先对左侧求值,再对右侧求值。如(A语句)||(B语句),若A真,则整个表达式真,此情况称为短路,若A假,则继续计算B。
例:判断闰年
switch语句
switch语句后必须是整型表达式或字符~
case后必须是整型常量表达式,与数字间有空格
break根据实际情况。
例:输入星期几
int main()
{
int d = 0;
scanf("%d", &d);
switch (d)
{
case 1:
printf("星期一");
break;
case 2:
printf("星期二");
break;
case 3:
printf("星期三");
break;
case 4:
printf("星期四");
break;
case 5:
printf("星期五");
break;
case 6:
printf("星期六");
break;
case 7:
printf("星期日");
break;
default:
printf("输错了");
break;
}
return 0;
}
例:输入工作日/休息日
int main()
{
int d = 0;
scanf("%d", &d);
switch (d)
{
case 1:
case 2:
case 3:
case 4:
case 5:
printf("工作日");
break;
case 6:
case 7:
printf("休息日");
break;
default:
printf("输错了");
break;
}
return 0;
}
循环语句
while语句
首先上来就是执行判断表达式,表达式的值为0,循环直接结束;表达式的值不为0,则执行循环语
句,语句执行完后再继续判断,是否进行下一次判断
for语句
ffro
for与while对比
do while语句
break/continue/goto
break 终止循环。
continue 跳出该次循环continue后面的代码。
goto 跳转,快速跳出循环。(尽量减少使用)
六、函数、数组与指针
一、函数
1. 定义与作用
函数是一段完成特定任务的代码块,通过模块化提高代码复用性和可读性。
2. 基本语法
返回值类型 函数名(参数列表)
{
// 函数体
return 返回值; // 若无返回值,类型为 void
}
示例:计算两数之和
#include <stdio.h>
// 函数声明
int add(int a, int b);
int main()
{
int result = add(3, 5);
printf("3 + 5 = %d\n", result); // 输出:8
return 0;
}
// 函数定义
int add(int a, int b)
{
return a + b;
}
3. 参数传递方式
值传递:函数内修改形参不影响实参。
地址传递:通过指针修改实参的值。
void swap(int *a, int *b)
{
int temp = *a;
*a = *b;
*b = temp;
}
4. 递归函数
函数调用自身,需有终止条件。
示例:阶乘
int fac(int n)
{
if (n <= 1) return 1;
return n * fac(n-1);
}
二、数组
数组可以不指定行但一定要指定列
1. 一维数组
定义与初始化:存储相同类型的数据,下标从0开始。
int nums[5] = {1, 2, 3, 4, 5}; // 初始化
int arr[3]; // 未初始化
arr[0] = 10; // 访问第一个元素
通过循环初始化数组
for (int i=0; i<5; i++)
{
printf("%d ", nums[i]); // 输出:1 2 3 4 5
}
2. 二维数组
定义与初始化:
int a[2][3] = {
{1, 2, 3}, {4, 5, 6}};
访问元素:
printf("%d\n", a[1][2]); // 输出第二行第三列元素:6
3. 数组与函数
数组名作为指针传递:
void printArray(int arr[], int size) {
for (int i=0; i<size; i++) {
printf("%d ", arr[i]);
}
}
三、字符串
1. 字符串的本质
C语言中,字符串是以 `\0`(空字符)结尾的字符数组。
char str1[] = "Hello"; // 自动添加 \0
char str2[6] = {'H', 'e', 'l', 'l', 'o', '\0'}; // 手动添加 \0
2. 常用字符串函数
需包含头文件 <string.h>
strlen(str)`:返回字符串长度(不含 `\0`)。
四、指针
1. 指针基础
定义:指针是存储变量地址的变量。
int num = 10;
int *p = # // p指向num的地址
printf("num的值:%d\n", *p); // 输出:10
2. 指针与数组
数组名是首元素的地址:
nt arr[] = {1, 2, 3};
int *p = arr;
printf("第一个元素:%d\n", *p); // 输出:1
printf("第二个元素:%d\n", *(p+1)); // 输出:2
3. 指针的算术运算
指针加减整数时,按类型大小移动:
double dArr[] = {1.1, 2.2, 3.3};
double *pd = dArr;
pd++; // 移动 sizeof(double)=8 字节,指向2.2
结语
这些知识只是C语言的冰山一角,但它们是构建复杂程序的基石。
编程的学习没有捷径,每一步都需要反复实践和思考。
本文若有疏漏或错误,恳请读者指正。学习之路,需众人同行,方能走得更远。共勉!
作者:596-hyb-