代码是从main函数开始,从上往下,从左往右执行;   C语言中只有 逗号',' 、 分号';' 、 括号'() 或者 {} 或者 []'、引号  不可写成中文


• C语言是什么?

    一门人与计算机交流的计算机语言,是一门编译型语言,是一种结构化的程序设计语言(支持三种结构: 顺序结构、选择结构、循环结构)--下方控制语句会讲解


        1) 编译型语言:C/C++

          xxxx.c/xxxx.cpp(本质上就是一个文本文件,与txt文件一致可由记事本打开,不能被计算机是不可以读懂,也就是说不可以被计算机执行)

    ---> 通过编译器(MSVC、clang、gcc)将 xxxx.c/xxxx.cpp 文件处理 生成xxxx.exe (xxxx.exe称为可执行程序,里面存的都是二进制的指令)

           --> 编译器先是编译

               一个项目由多个源文件构成,多个源文件经由 cl.exe(编译器) 生成了对应的 xxx.obj文件,这个步骤就叫编译

           --> 然后是链接

               多个源文件对应的多个xxxx.obj文件+'链接库' 经由 link.exe(链接器) 生成了一个 xxxx.exe可执行程序,这个步骤就叫链接


        2) 既是编译型又是解释型语言:Java

            Java既不属于传统的编译型语言, 也不属于解释型语言

            Java是先编译成".class"字节码文件, 然后再利用JVM虚拟机进行解释执行的, 所以Java即可以说成编译型, 也可以说成解释型


        3) 解释型语言:Python

            经过 解释器 对其代码进行解释交由计算机执行



• C语言的历史和辉煌

    C生万物,起初是作为unix系统的开发工具二发明出来的



• 编译器的选择VS2022

    | 集成开发环境(IDE)用于提供程序开发环境的应用程序, 一般包括代码编辑器、编译器、调试器和图形用户

    | 界面等工具。集成了代码编写功能、分析功能、编译功能、调试功能等一体化的开发软件服务套。

    | vscode 不属于IDE,它属于编辑器


    vs2022

        1、添加项目

            打开软件 -> 创建新项目 -> 所有语言换成C++ -> 空项目 -> 下一步 -> 自己选择项目名字(项目名字和所属文件路径尽量不能有中文)

            -> 右击源文件 -> 添加 -> 新建项 -> 显示所有模版 -> 将名称改为 xxxx.c -> 添加即可

        2、 关闭项目,但又不关闭vs2022:  文件 -> 关闭解决方案

        3、 vs2022 中直接运行不调试的快捷键 Ctrl + F5   /  Fn + Ctrl + F5

        4、 vs2022 在 上面项目的标题栏/项目栏 处右击选择打开所在的文件夹,即可找到 xxx.c 文件所在目录

            同级目录的 x64目录 下放有其对应的 xxx.obj文件

            上一级目录的 x64目录 下放有其对应的 xxx.exe文件

        5、vs2022 开启单行运行的快捷键 F10

            按一下 F10 就执行 main函数里面的 一行代码

        6、 vs2022 快速注释的快捷键 Ctrl + K + C

        7、 vs2022 快速取消注释的快捷键  Ctrl + K + U

        8、 vs2022 快速调节字体 Ctrl + 滑动鼠标的滚轮

        9、 更改主题: 工具 -> 选项 -> 主题

        10、更改字体: 工具 -> 选项 -> 字体和颜色

        11、更改背景颜色: 工具 -> 选项 -> 字体和颜色

        12、显示行号:  工具 -> 选项 -> 文本编辑器下的C/C++里面就有行号 -> 打勾

        13、监视窗口:  F10 -> 调试下的窗口 -> 监视

        14、Tab字节设置: 工具下选项 -> 文本编辑器下的C/C++下面的制表符 默认是4字节

            但是一般不设置,Tab一般都是对齐规则,设置了也没用,有时候是 2字节,3字节,视情况而定



• 源文件、头文件介绍

    源文件: xxx.c文件,里面存放的的是代码主体

    头文件: xxx.h文件,里面存放的是一些库函数,有点相当于Python里面的(模块)头文件

                     也就是模块,但是为了与C语言的模块不弄混,以后统一称之为头文件



• 第一个C语言程序 —— C语言代码都是函数组合在一起的(printf、main、scanf...)

    #include<stdio.h>

    int main()

    {

        printf("Hello world!");

        return 0;

    }



• main函数

    基本语法

        main 函数的多种写法

            int main()        ----- int 为返回数据类型,main 为函数名,括号内放参数 —— void表示无需传参;int a,int b表示传入两个int参数

            {                   |

                代码            |     大括号内的称之为函数体

                代码...         |

                return 0;       |     int和return必须一一对应,在这里int与return 0一一对应

            }                   |

        下面的main函数写法与上面的main写法一致

            int main(void)

            {

                return 0;

            }

        如果()里面传入了参数,那么也是正确的。main函数是可以有参数的,参数是有特殊用途的。这种情况较为复杂,日后再说。

    基础介绍

        main 前面的 int 表示 main 函数执行结束的时候返回一个整型类型的值。

        所以在main 函数的最后写return 0; 正好前后呼应。

        main函数return 0;是一个历史习惯,表示无错误 可执行程序返回给操作系统是 正常返回,异常返回会抛异常

    使用细节

        每个 C 语言程序不管有多少行代码, 都是从main 函数开始执行的,  main 函数是程序的入口, main 函数也被叫做: 主函数。

        • main函数是程序的入口

        • main函数有且仅有一个

        • 即使一个项目中有多个.c文件, 但是也只能有一个main函数(因为程序的入口只能有一个)

        • C语言中有 逗号、分号、(小)括号 不可以使用中文的



• printf和库函数  stdio.h  -- 'standard input output'.h -- 标准输入输出头文件

    printf:

        这里简单的介绍一下 printf ,  printf 是一个库函数, 它的功能是在标准输出设备(一般指屏幕)上进行信息的打印

            print -- 打印, f -- format -- 格式,按照指定的格式打印

        例: printf("%c\n",100)    结果:d

            printf("%d\n",d)      结果:100

            printf("%d\n",100)    结果:100

            printf("%f\n",3.5f)   结果:3.5

            ~ printf("%lf",3.5)  编译器默认是 double 类型的数据,所以要么数字后面加上f,要么f前面加上l(小写 L),切不可以都存在

    库函数:

        为了不再重复实现常见的代码, 让程序员提升开发效率

        C语言标准规定了一组函数, 这些函数再由不同的编译器厂商根据标准进行实现, 提供给程序员使用。

        不同编译器厂商实现方式不一样,但功能(体验的效果)一样.

        这些函数组成了一个函数库, 被称为标准库, 这些函数也被称为库函数。

        在这个基础上一些编译器厂商可能会额外扩展提供部分函数(这些函数其他编译器不一定支持)。

        一个系列的库函数一般会声明在同一个头文件中, 所以库函数的使用, 要包含对应的头文件。



• 关键字介绍  ---- 不属于任何库文件, 而是在语法的核心中定义

    C语言中有一批保留的名字的符号, 比如:  int 、if 、return , 这些符号被称为保留字或者关键字。

    • 关键字都有特殊的意义, 是保留给C语言使用的

    • 程序员自己在创建标识符的时候是不能和关键字重复的

    • 关键字也是不能自己创建的

    C语言的32个关键字如下:

        auto、break、case、char、const、continue、default、do、double、else、enum、extern

        float、for、goto、if、int、long、register、return、short、signed、sizeof、static

        struct、switch、typedef、union、unsigned、void、volatile、while、_Bool



• 字符和ASCII编码

    字符和字符串

        在键盘上可以敲出各种字符, 如: a, q, @, #等, 这些符号都被称为字符, C语言中字符是用单引号括起来的, 如: 'a', 'b', '@'

        字符串都是由双引号引起来

    ASCII编码

        概念

            我们知道在计算机中所有的数据都是以二进制的形式存储的, 那这些字符在内存中分别以什么样的二进制存储的呢?

            如果我们每个人自己给这些字符中的每个字符编一个二进制序列, 这个叫做编码,

            为了方便大家相互通信, 不造成混乱, 后来美国国家标准学会(ANSI)出台了一个标准 ASCII 编码,

            C语言中的字符就遵循了 ASCII 编码的方式

        注意

            • 字符A~Z的ASCII码值从 65~90

            • 字符a~z的ASCII码值从 97~122

            • 对应的大小写字符(a和A)的ASCII码值的差值是 32

            • 数字字符0~9的ASCII码值从 48~57

            • 换行 \n 的ASCII值是: 10

            • 在这些字符中ASCII码值从0~31 这32个字符是不可打印字符, 无法打印在屏幕上观察



• 字符串和\0

    字符串

        使用双引号括起来的一串字符就被称为字符串, 如: "abcdef", 就是一个字符串

            字符串的打印格式  非数组建议直接打印,数组可以使用  printf("%s",数组名)/循环printf("%c",数组名[i])  打印

        请判断下面哪个是字符串

            char a[] = "abc"; yes

            char a[] = "a"; yes

        字符串与数组的区别

            以 \0 结尾且其它位置无 \0 的 字符数组 即为字符串,字符数组 即只包含字符的数组

              char a[] = "abc";  ~  char a[] = {'a','b','c','\0'};

                字符数组长度是固定的, 其中任何一个数组元素都可以为null字符。因此, 字符数组不一定是字符串

                字符串必须以null结尾, 其后的字符不属于该字符串。字符串一定是字符数组, 它是最后一个字符为null字符的字符数组

                数组的元素可以是任意一种类型, 而字符串是一种特殊的数组, 它使用了一种众所周知的确定其长度的规则

    \0 -- 一种转义字符

        字符串的结束标志,字符串末尾自带 \0 (隐藏).

        如果一个字符串中间有\0的话,那么,这个字符串实际上就是\0之前的那么一小部分(在字符数组里面除外)

            例:  printf("X\0sjdiwi");   结果:X    ~      printf("\130\0sjdiwi");   结果: X



• 转义字符  -- 转变原来字符的意义

    \?: 在书写连续多个问号时使用, 防止他们被解析成三字母词, 在新的编译器上没法验证了

            三字母词: ??+'任意一个其它的字符',  '??)' ~~ ']'

           现在的编译器不再支持三字母词了,三字母词只在古老的编译器里面存在

    \': 用于表示字符 '

    \": 用于表示一个字符串内部的双引号 即 "\""

    \\: 用于表示一个反斜杠, 防止它被解释为一个转义序列符

    \a: 警报, 这会使得终端发出 警报声或出现闪烁, 或者两者同时发生

    \b: 退格键, 光标回退一个字符, 只要后面不再输出任何内容,就不会替换字符;如果程序立马结束,就会删除,我们的bash是默认在最后加上\0

            printf("abcde\b")    调试结果: 'abcde'   (光标一直停留在e上)  运行结果: 'abcd'

            printf("abcde\baa")  结果: 'abcdaa' (e被覆盖删除)

            printf("abcde\b\naa")结果: 'abcde'  'aa'换行输出(e未被覆盖)

        想要替换就只能在\b后面加上字符,而非转义字符

    \n: 换行符

    \r: 回车符, 光标移到同一行的开头,不管如何都会删除字符,除非是在\r后面有转义字符

            printf("abcde\r")      结果: ' bcde'   (光标一直停留在a上)

            printf("abcde\rf")     结果: 'f cde' (a被覆盖删除)

            printf("abcde\b\naa")  结果: 'abcde'  'aa'换行输出(abc未被覆盖)

    \t: 制表符, 光标移到下一个水平制表位, 通常是下一个8的倍数

        对齐符,同一行就是'\txxxx\t'之间的xxxx输出字节为8个,不够就用空格补齐;不同行就是对齐

    下面2种转义字符可以理解为: 字符的8进制或者16进制表示形式

        \ddd : d d d表示 3个八进制 数字,即每一个 d 都是一个八进制数字.这3个八进制数字换算成十进制后不可以超过 127(ASCII码取值是0~127)

               它对应着将 八进制数字 转换为十进制以后对应的ASCII码的字符, 可以理解为一个字符的八进制表示形式

            如:  \130 表示字符 X

                表示将130变成十进制数 (1*8^2 + 3*8^1 + 0*8^0 = 88),对应于 ASCII码表的 X(大写)

        \xdd : x 表示十六进制,不可以更改; d d表示 2个十六进制 数字,即每一个 d 都是一个十六进制数字.

               这2个十六进制数字换算成十进制后不可以超过 127(ASCII码取值是0~127)

               它对应着将 十六进制数字 转换为十进制以后对应的ASCII码的字符, 可以理解为一个字符的十六进制表示形式

            如:  \x30 表示字符 0; 是字符0,不是数字0

    \0 : null 字符,代表没有内容,对应于ASCII码表的第0号字符,\0 就是\ddd 这类转义字符的一种, 用于字符串的结束标志, 其ASCII码值是0.



• strlen 函数

    基本介绍

        strlen 函数的全拼是 string length

    基础语法

        strlen(对应的字符串) ------ 对应的字符串应该使用双引号引起来

    基本功能

        求一个对应的字符串的长度,不包含 字符串的结束标志(\0),并返回一个长度(int)数值

    使用细节

        属于 string.h 文件,使用时先调用对应的头文件 '#include <string.h>'

        转义字符算一个字符长度, \ddd 或者 \xdd 算一个字符长度

        中间有\0的话就直接结束,只统计\0之前的字符串长度(因为整个字符串遇到\0就结束了)



• 语句和语句分类

    C语言的代码是由一条一条的语句构成的(每一条语句又由函数构成), C语言中的语句可为以下五类:

        • 空语句

            基本说明

                空语句是最简单的, 一个分号就是一条语句, 是空语句。

            示例代码

                #include <stdio.h>

                int main(){

                    ;           //空语句

                    return 0;

                }

            使用细节

                空语句, 一般出现的地方是: 这里需要一条语句, 但是这个语句不需要做任何事, 就可以写一个空语句。

                相当于 Python 中的pass

        • 表达式语句

            基本说明

                表达式语句就是在表达式的后边加上分号。

            示例代码

                #include <stdio.h>

                int main(){

                    int a = 20;

                    int b = 0;

                    b = a + 5;      //表达式语句

                    return 0;

                }

        • 函数调用语句

            基础说明

                函数调用的时候, 也会加上分号, 就是函数调用语句。

            示例代码

                #include <stdio.h>

                int Add(int x, int y){

                    return x+y;

                }

                int main(){

                    printf("hehe\n");     //函数调用语句

                    int ret = Add(2, 3);    //函数调用语句

                    return 0;

                }

            使用细节

                不管是在main函数里面调用库函数还是调用自己定义的函数, 都可以称为函数调用语句

        • 复合语句

            基础说明

                复合语句其实就是前面讲过的代码块, 成对大括号中的代码就构成一个代码块, 也被称为复合语句。

            代码演示

                #include <stdio.h>

                void print(int arr[], int sz){ //函数的大括号中的代码也构成复合语句

                    int i = 0;

                    for(i=0; i<sz; i++){

                            printf("%d ", arr[i]);

                        }

                }

                int main(){

                    int i = 0;

                    int arr[10] = {0};

                    for(i=0; i<10; i++){ //for循环的循环体的大括号中的就是复合语句

                        arr[i] = 10-i;

                        printf("%d\n", arr[i]);

                    }

                    return 0;

                }

        • 控制语句

                控制语句用于控制程序的执行流程, 以实现程序的各种结构方式 (C语言支持三种结构: 顺序结构、选

            择结构、循环结构), 它们由特定的语句定义符组成, C语言有九种控制语句。

            可分成以下三类:

            1. 条件判断语句也叫分支语句: if语句、switch语句;  ------选择结构

            2. 循环执行语句: do while语句、while语句、for语句;  -------循环结构

            3. 转向语句: break语句、goto语句、continue语句、return语句。 ------顺序结构 <--- 代码是从main函数开始,从上往下,从左往右执行



• 注释是什么?为什么写注释  -----  使代码可读性较高

    // 所需注释的内容    ----- 单行注释

    /* 所需注释内容  */   ------ 多行注释,可写在代码里面,不可以嵌套使用

        注意!!!!

            /**/ 不可以嵌套使用:

                /*内容1 /*内容2*/ 内容3*/  ------- 内容3没被注释, 因为无论前面有多少个 /* 都只会匹配一个 */ 作为结束的标志

    使用细节

            编译时, 注释会被替换掉, 会被替换成为一个空格

        例:

            printf("dwadw/*dwawd*/dwa");    结果:dwadw dwa


            int a/*jnskdjwio*/d = 0;     报错    ~~~  int a b =0;