单片机入门基础——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.注释

  1. 单行注释

    #include<stdio.h>    
    void main()
    {    
        //printf("C语言好难");
        printf("hahaha,C语言真简单");    
    }

    上述代码仅输出hahaha,C语言真简单

  2. 多行注释

    #include<stdio.h>    
    void main()
    {    
        /*printf("C语言好难");
          printf("hahaha,C语言真简单"); 
       */
       printf("hahaha,C语言一点不简单");
    }

    上述代码输出hahaha,C语言一点不简单

二、标识符与关键字

标识符命名规则

  1. 有效的标识符可以包含字母(大写和小写字母),数字和下划线。

  2. 标识符的首字母应为字母或下划线。

  3. 您不能将关键字用作标识符。

  4. 标识符的长度没有指定。但是,如果标识符超过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 = &num; // 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-

    物联沃分享整理
    物联沃-IOTWORD物联网 » 单片机入门基础——C语言程序设计

    发表回复