01-C语言:第01天笔记

C语言:第1天笔记

内容提要

  • C语言概述
  • 数据类型
  • 常量
  • 变量

C语言概述

计算机基础

计算机的组成
计算机组成
  • 计算机:能进行计算以及逻辑处理的设备

  • 硬件:组成计算机的物理部件。(内存条、CPU、硬盘…)

    开发中对于硬件的认知:

    ​ 硬件包括电子设备、单片机、集成电路和嵌入式系统。

  • 软件:计算机中运行的程序和数据。

    开发中对于软件的认知:

    ​ 软件分为系统软件(OS)、应用软件和编程工具(编译器)

计算机的六大部件
  • 中央处理器(CPU):控制 + 计算
  • 内存:临时存储运行时的数据。
  • 输入设备:向计算机输入数据(键盘、鼠标、扫码枪)
  • 输出设备:将计算机数据进行输出(显示器、打印机)
  • 外存储器:永久存储数据(硬盘)
  • 网络:数据传输与通信
计算机的工作原理
  • 存储程序:程序和数据存储在内存中
  • 程序控制:CPU按指令顺序执行
计算机的语法
  • 机器语言:二进制代码,直接控制硬件
  • 汇编语言:助记符形式,需要汇编器翻译
  • 高级语言:C/C++,Java,Python,PHP,C#,GO

C语言简史与特点

C语言的起源
  • 其前身是B语言;
  • B语言是美国贝尔实验室的 Ken Thompson(肯·汤普森)于1969年开发出来的,并且用B语言编写了初版的UNIX系统
  • 1972年美国贝尔实验室的Dennis Ritchie(丹尼斯·M·里奇)在B语言基础上开发的C语言.C语言提供了丰富的数据类型和标识符,使得程序的编写变得非常高效和方便。
  • 1973年初,C语言的主体完成。汤普森和里奇迫不及待地开始用它完全重写了UNIX。
C语言的标准

为了C语言健康发展下去,很多有识之士及美国国家标准协会(ANSI)于1982年成立了一个委员会以确定C语言的标准。

  • 1989 ANSI 发布了第一个完整的C语言标准,即C89。不过人们习惯性的称为 “ANSI C”
  • 1990年ISO(国际标准化组织一字不改的采纳了 C89,官方给出的名称为 ISO C90) 。
  • 1999年,C语言标准经过了一次修正和完善后,ISO发布了新版的C语言标准,简称” C99”。
  • 2018年6月份发布的 “C18”GNU C 标准 (标准C的扩展) ,进一步增强了语言的稳定性和功能性。
  • 在2011年12月8日,ISO又正式发布了新的标准,称为ISO/IEC9899:2011,简称为“C11”。
  • “C23”是最新的标准,预计将进一步扩展C语言的功能和性能。
  • 应用于Linux 系统,当然Linux也支持标准C,因为标准C是跨平台的。

嵌入式开发就是针对Linux系统的开发,而Linux系统是使用C语言开发的,所以从事嵌入式开发要使用C语言。

C语言特点
  • 简洁高效,支持底层硬件操作
  • 可移植性强,适合结构化编程
  • 生成代码质量高,执行速度快

C语言程序的开发过程(掌握)

开发的三个步骤

① 编辑:编写源代码(.c文件,程序员完成)

② 编译:将源代码文件转换为可执行的文件(编译器完成)

③ 运行:执行程序(操作系统加载)

C语言程序的编译过程

注意:本章节只是做一个简单的讲解,后续在深入!

上面提到的编译,实际上是分为了四个步骤:

  1. **预处理:**处理宏和头文件以及注释等。
  2. 编译: 生成汇编代码
  3. **汇编:**转换为机器码/二进制代码
  4. **链接:**合并库文件和目标文件(二进制代码)

测试代码:

// 头文件包含  预处理的时候,会将stdio.h中的代码全部拷贝到当前文件
#include 

// 宏定义
#define R 2
#define PI 3.14

int main()
{
	printf("hello world!\n");
	
	// 计算圆的面积
	double area = PI * R * R; // 宏展开,double area = 3.14 * 2 * 2
	
	printf("%f\n", area);
}

编译的命令

编译步骤 命令 文件类型 说明
预处理 gcc -E *.c -o *.i *.c → *.i 生成的是C代码(文本)
编译 gcc -S *.c -o *.s *.i → *.s 生成的是汇编代码(文本)
汇编 gcc -c *.c -o *.o *.s → *.o 生成的是二进制代码(文本)
链接 gcc *.c -o * 生成的是二进制代码

C语言的基本结构

一个简单的C语言程序

功能:要求在控制台输出“hello world!”

代码:

#include

// 主函数:一个.c文件只能有一个main函数,这个函数是程序的入口
int main()
{
// 向控制台输出hello world!
printf(“hello world!\n”);

return 0;

}


![外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传](https://img-home.csdnimg.cn/images/20230724024159.png?origin_url=.%2Fassets%2Fimage-20250708104405623.png&pos_id=img-Zm14kjic-1751972604172)

程序结构分析:

- 注释:解释代码逻辑,写给程序员自己看,预处理阶段会被删除。

- 预处理指令:程序中包含的某一文件内容(`#include `)

- 主函数:`main`函数是程序唯一的入口,一个文件中最多有1个,==这个函数不能被其他函数调用==,这是一个自动执行的函数,系统是通过这个函数的指针进行访问的。

- 关于函数:

  - **函数头:**(函数首部或者函数说明)

    说明函数类型,函数头由==函数名==和==形参列表==构成。

    ![外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传](https://img-home.csdnimg.cn/images/20230724024159.png?origin_url=.%2Fassets%2Fimage-20250708105004138.png&pos_id=img-PMpj6xZe-1751972604174)

  - **函数体:**

    包括==变量说明==和==语句执行==部分。

    image-20250708105139307

- 函数调用语句:比如:printf()

  image-20250708105304098

### C语言编程规范要求

C语言在编程的时候,需要遵循如下规范:

- 常用的缩进格式(一般缩进2~4个字符,推荐缩进4个字符,我们Vim配置的是缩进4个字符,也就是一个`Tab键`)

- 要有足够的注释(添加必要的注释,使代码更好理解)

- 要有合适的空行(一般预处理指令和函数之间,函数和函数之间,全局变量和函数之间...,加空行提高代码可读性,使代码结构清晰) 

  
  #include 
  #include 
  
  #define PI 3.14
  #define R 2
  
  int fun()
  {
  	printf("A\n");
  }
  
  int main(int argc,char *argv[])
  {
      printf("hello world!\n");
  	fun();
  	
      return 0;
  }
  
  • {}对齐(C和C++{}都需要独占一行,千万不要受Java影响)

    Java

    int fun() {
        ...
    }
    

    C/C++

    int fun()
    {
    	...
    }
    
  • 函数体内采用分层缩进和模块化的书写方式。

    int fun()
    {
        if(..)
        {
            for(..)
            {
                printf("hello\n");
            }
        }
        
        if(..)
        {
            for(..)
            {
                printf("hello\n");
            }
        }
    }
    
  • 不把多条语句写在程序的同一行上(最好的区分是,不要在同一行连续出现多个;,for循环(;;)除外)

    int main()
    {
        // 错误写法(不影响编译,但是影响阅读体验)
        printf("hello"); printf("hello"); printf("hello");
        
        // 错误写法(不影响编译,但是影响阅读体验)
        int a = 10; int b = 20;
        
        // 正确写法
        for (;;)
        {
            ...
        }
    }
    
  • 标识符命名要见名知意。

    int main()
    {
        // 创建3个变量,用来存储年龄、身高、体重
        
        // 错误演示(不影响编译,但是影响阅读体验)
        int a = 21;
        int b = 168;
        int c = 190;
        
        // 正确演示
        int age = 21;
        int height = 168;
        int weight = 190;
    }
    

C语言程序的设计特点

C语言程序在设计的时候,需要注意以下细节:

  • C程序有一个或多个函数组成,但有且仅有一个main函数;这个函数是程序的入口函数,可以置于任意位置,建议放在所有函数的最下面

  • 程序中可以有预处理指令(#include、#define),预处理指令通常放在程序的最前面。

  • 每个语句以分号结尾:(注意:预处理,函数头,函数、分支语句、while和for语句后面不能添加分号,否则会报错)

  • 函数体由一对{}括起来,函数的{}不能省略。

  • 包含在/*..*/内,或者//..后面的文本为注释内容,在预处理阶段删除。

  • 一行可以写多个语句,一个语句可以写在多行上。

    int main()
    {
        // 一行可以写多个语句
        int a, b, c;
    
        // 一个语句写在多行上
        while(1)
        {
            ...
        }
    }
    // 格式化笔记中的代码:shift + tab
    

    C语言中的注释

    在C语言中,注释一般分为两类:单行注释多行注释

    注释的作用:给代码添加解释说明性文字,提升代码的可读性,注释本身不参与编译,在预处理阶段会被删除。我们同时也可以使用注释屏蔽掉暂时不需要的代码。

    单行注释

    说明:单行注释使用双斜杠//..表示。我们一般用于变量、常量、函数调用语句等。

    语法:

    // 需要注释的内容
    

    范例:

    // 预处理指令,引入系统的标准输入输出库
    #include 
    
    int main()
    {
        // 向控制台打印输出 hello world!
        printf("hell world!\n");
        
        return 0;
    }
    
    多行注释

    说明:多行注释使用双斜杠星花/*..*/表示。它可以占用一行,也可以占用多行,但不能嵌套。我们一般用于函数,文件头说明等。

    语法:

    /* 要注释的内容 */
    
    /*
       要注释
       的内容
    */
    

    范例:

    /*
       主函数
     */
    int main()
    {
        ...
    }
    

    注意:由多行注释衍生出一种更为细致的注释,我们称之为文档注释

    范例:

    /**
     * 主函数
     * @author 开发者
     * @param  参数1 说明
     * @param  参数2 说明
     * @return 返回值
     */
    int main()
    {
        ...
    }
    

数据类型

定义

数据类型其实就是固定大小内存的别名,并且描述了一个变量存放什么类型的数据。简单来说,就是组织和操作数据。

**数据:**计算机要处理的数据(数字、字符串、文字、符号、图片、音视频等)

  • 数据类型不仅帮助我们组织和操作数据,还决定了程序如何有效的利用内存。
  • 了解数据类型的内存需求是理解计算机管理和操作数据的关键。

小贴士:程序运行需要在内存中

数据类型分类和计算方法

数据类型分类(重点)
  • 基本类型(C语言内置)
    • 数值类型
      • 整型(整数)
        • 短整型:short(short int 缩写)
        • 基本型:int(使用频率最高)
        • 长整型:long(long int 缩写)
        • 长长整型:long long(long long int 缩写,C99新增)
      • 浮点型(小数、实数、实型)
        • 单精度型:float
        • 双精度型:double
        • 长双精度型:long double(C99新增)
    • 字符型:char
  • 构造类型(C语言提供语法,用户自定义)
    • 结构体:struct
    • 联合体/共用体:union
    • 枚举类型:enum
  • 指针类型
  • 空类型:void(C语言内置)
数据类型在内存中的大小(重点)
序号 数据类型 中文说明 大小(字节)
1 short(short int) 短整型 2
2 int 基本整型 4
3 long(long int) 长整型 4(32位系统)/ 8(64位系统)
4 long long(long long int) 长长整型 8
5 float 单精度浮点型 4
6 double 双精度浮点型 8
7 char 字符型 1
8 bool(_Bool,C99新增) 布尔型,true-真,false-假 bool:1,true(1):4,false(0):4

课后作业:自己查资料获取每个数据类型的范围?举例:char:-128 ~ 127

小贴士:

获取某个数据类型或者变量所占的字节数,使用sizeof运算符:sizeof(某个数据类型或者变量名)

 printf("true size:%d\n", sizeof(true));  // trus size:4   解释:true本身就是int类型的1,所以占4个字节
 printf("bool size:%d\n", sizeof(bool));  // bool size:1   解释:占1个字

案例:

#include

int main(int argc,char *argv[])
{
// 计算数据类型或者变量的字节大小,通过sizeof运算符
printf(“long long 的大小是%d个字节\n”, sizeof(long long)); // %d 表示10进制整数
printf(“long 的大小是%d个字节\n”,sizeof(long));
printf(“long double的大小是%d个字节\n”,sizeof(long double));
return 0;
}


运行结果:

![外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传](https://img-home.csdnimg.cn/images/20230724024159.png?origin_url=.%2Fassets%2Fimage-20250708152205165.png&pos_id=img-UIWUghAW-1751972604174)

总结:

① 数据类型在内存中所占的字节数跟C语言的编译系统有关。 
② 计算某个数据类型所占字节数可以用sizeof运算符。 
③ 布尔类型要添加`#include `,大家也可以直接使用int类型的0和1来表示布尔类型。

#### 课堂练习

校验各个数据类型在内存中的大小。

## 常量

在C语言中,数据的基本表现形式是==常量==和==变量==。不管是变量还是常量,都是需要在内存中申请一块空间,用于数据的存放。

**定义:**在程序执行过程中其值不可改变的量。称之为常量。

**分类:**int、float、double、char、符号常量(宏定义)。

### 整型常量

- 整型常量可以用十进制、八进制、十六进制三种形式表示。

  - **十进制常量:**由数字==0~9==构成,没有前缀,不能以0开头。举例:

    ```c
    99,218     // 正确
    0          // 正确
    09         // 错误,不能以0开头
    ```

  - **八进制常量:**由数字==0~7==构成,以==0==为前缀,==不能表示小数==。举例:

    ```c
    023,077    // 正确
    00         // 正确
    099        // 错误
    ```

  - **十六进制常量:**由数字==0~9==、字母==a ~ f/A ~ F==构成,以==0x / 0X==为前缀,==不能表示小数。==举例:

    ```c
    0xffffff   // 正确
    0x0        // 正确
    ```

  > **注意:**
  >
  > 整型常量中的长整型数据可用`L或者l`作为后缀,举例:
  >
  > ```c
  > long num = 123L;
  > ```

- 整型常量的分类:

  - 有符号与无符号基本整型常量(int)

    - 有符号表示范围:==负数 + 0 + 正数==,默认写的都是有符号

    - 无符号表示范围:==0 + 正数==,内存中所有负数的位置都用来表示整数,此时它的正数范围超过有符号正数范围。

      image-20250708164135596

  - 有符号与无符号长整型常量(long)
  - 有符号与无符号短整型常量(short)

- 整型常量的表示
  - 十进制表示:可以使用10个数字符号0~9以及`+,-`,如:123,-90
  - 八进制表示:以0开头,可以使用7个数字符号0~7以及`+,-`,如:0123,-011
  - 十六进制表示:以0x或者0X开头,可以使用`0~9`以及`A~F(a~f)`,如:0x12,-0x12

### 浮点型常量

C语言中浮点数就是平常说的小数(实数),有两种表现形式:

- **十进制小数:**如:0.123,-12.6,0.123F(==float类型的常量,需要跟上`F/f`==)
- **指数形式(科学计数法):**
  - 正数表示:如十进制小数$1234.5$的指数表示法就是$1.2345*10^3$,也可以表示为$1.2345e3$
  - 负数表示:如十进制小数$0.012$的指数表示法就是$1.2*10^{-2}$,也可以表示为$1.2e-2$

**注意**:

① 在符号e的前面必须要有数字

② 在符号e的后面必须为整数,不能是带有小数点的实数型。

③ 实型常量的后缀用F/f表示单精度型。

### 字符型常量

用单引号`''`括起来的一个字符,如`'a', 'A', '4', '_'`等,比如:`'刘'`就不是字符,一个汉字所占的字节数超过1个字符。中文符号当成汉字理解。==英文输入法下输入的字母、数字、符号都是单字符==。

**转义字符常量:**以反斜杠`\`开头的字符序列,表示控制以及不可见字符。如:

| 字符形式 | 中文含义   | ASCII码 |
| :------- | :--------- | :------ |
| \n       | 换行       | 10      |
| \r       | 回车       | 13      |
| \0       | 空字符     | 0       |
| \t       | 水平制表符 | 9       |

> **注意:**
>
> 使用`man ascii`可以查看所有的ASCII字符。

### 字符串常量

说明:在C语言中,==支持字符串常量,不支持字符串变量。==字符串变量需要使用字符数组或者字符指针实现。

- 用一对双引号`""`括起来的一个字符序列,如:

  ```c
  "How do you do? zhaopeipei"
  "hello world!"
  "12"
  “true”
  "12.25"
  • 可以使用printf输出一个字符序列,如:

    printf("%s","hello world!\n");
    printf("hello world!\n"); // 等价于上面写法
    

注意

字符常量’a’与字符串常量"a"的区别:

系统自动为字符串常量加上结尾的\0,使所占内存单元多一个,单字符常量的长度不变,可用sizeof()运算符来测量。

符号常量

说明:一般通过宏定义,在预处理的时候替换成具体的常量

定义一个标识符来代表一个常量,如:用PI表示圆周率π(3.1415926)

好处:

  • 增加代码的可读性
  • 增强了代码的可维护性

定义符号常量:

  • 需要借助预处理指令:#define

  • 格式:

    #define 宏名称 宏值
    
  • 注意:

    • 宏名称和宏值之间用空格隔开

    • 句末不能添加任何符号

    • 无参的宏名称的命名采用大写,如果有多个单词,使用下划线分隔,举例:

      #define MAX_VAL 9999
      #define MIN_VAL 1000
      
  • 举例:

    #include 
    
    // 定义符号常量
    #define PI 3.14
    #define R 20
    
    int main(int argc,char *argv[])
    {
        // 计算圆的周长 2 × PI × R
        printf("计算圆的周长:%f\n",2 * PI * R);// %f:以小数显示
    
        // 计算圆的面积 PI × R × R
        printf("计算圆的面积:%f\n",PI * R * R);
    
        return 0;
    }
    
    

日常错误

  • 问题描述:编译过程中,控制台提示类似于 \357这样的信息

  • 解答:这是由于代码中使用了中文标点符号导致的错误

  • 演示:

课后预习

  • 进制转换

  • 需要借助预处理指令:#define

  • 格式:

    #define 宏名称 宏值
    
  • 注意:

    • 宏名称和宏值之间用空格隔开

    • 句末不能添加任何符号

    • 无参的宏名称的命名采用大写,如果有多个单词,使用下划线分隔,举例:

      #define MAX_VAL 9999
      #define MIN_VAL 1000
      
  • 举例:

    #include 
    
    // 定义符号常量
    #define PI 3.14
    #define R 20
    
    int main(int argc,char *argv[])
    {
        // 计算圆的周长 2 × PI × R
        printf("计算圆的周长:%f\n",2 * PI * R);// %f:以小数显示
    
        // 计算圆的面积 PI × R × R
        printf("计算圆的面积:%f\n",PI * R * R);
    
        return 0;
    }
    
    

日常错误

  • 问题描述:编译过程中,控制台提示类似于 \357这样的信息

  • 解答:这是由于代码中使用了中文标点符号导致的错误

你可能感兴趣的:(c语言,笔记,开发语言)