目录
C语言的关键字
输出语句
注释/转义字符/接续字符
计算机进制
ASCLL码
计算机单位
三种程序结构
编程演进史
C 语言教程 | 菜鸟教程
华为C语言编程规范(精华总结)_不脱发的程序猿的博客-CSDN博客_华为c语言编程规范
01
环境配置C 环境设置 | 菜鸟教程
02
基本结构C 程序结构 | 菜鸟教程
03
基本语法C 基本语法 | 菜鸟教程
C语言的关键字
C语言关键字及其解释[共32个]_阿强打代码的博客-CSDN博客_c语言的32个关键字及其含义
问:Include和main是c语言的关键字吗? - 知乎
C语言typedef的用法详解_风叶翩翩的博客-CSDN博客_c语言中typedef的用法
(1)typedef是C语言中一个关键字,作用是用来定义(或者叫重命名类型)
(2)C语言中的类型一共有2种:一种是编译器定义的原生类型(基础数据类型,如int、double之类的);第二种是用户自定义类型,不是语言自带的是程序员自己定义的(譬如数组类型、结构体类型、函数类型·····)。
(3)我们今天讲的数组指针、指针数组、函数指针等都属于用户自定义类型。
(4)有时候自定义类型太长了,用起来不方便,所以用typedef给它重命名一个短点的名字。
(5)注意:typedef是给类型重命名,也就是说typedef加工出来的都是类型,而不是变量。比如typedef char* (*pType)(char *, const char *) ,这里pType就是这种类型char* (*)(char *, const char *) 的别名。
typedef与结构体
(1)结构体在使用时都是先定义结构体类型,再用结构体类型去定义变量。
(2)C语言语法规定,结构体类型使用时必须是struct 结构体类型名 结构体变量名;这样的方式来定义变量。
(3)使用typedef一次定义2个类型,分别是结构体变量类型,和结构体变量指针类型。
typedef struct student{
int age;
}student, *pStudent;typedef与const
(1)typedef int *PINT; const PINT p2; 相当于是int *const p2;
(2)typedef int *PINT; PINT const p2; 相当于是int *const p2;
(3)如果确实想得到const int *p;这种效果,只能typedef const int *CPINT; CPINT p1;使用typedef的重要意义(2个:简化类型、创造平台无关类型)
(1)简化类型的描述。
char *(*)(char *, char *); typedef char *(*pFunc)(char *, char *);
(2)很多编程体系下,人们倾向于不使用int、double等C语言内建类型,因为这些类型本身和平台是相关的(譬如int在16位机器上是16位的,在32位机器上就是32位的)。为了解决这个问题,很多程序使用自定义的中间类型来做缓冲。譬如linux内核中大量使用了这种技术.
内核中先定义:typedef int size_t; 然后在特定的编码需要下用size_t来替代int(譬如可能还有typedef int len_t)
(3)STM32的库中全部使用了自定义类型,譬如typedef volatile unsigned int vu32;
输出语句
【C语言】- printf 和scanf 函数详解!_C语言编程俱乐部的博客-CSDN博客_c printf scanf
C 库函数 – printf() | 菜鸟教程
注释/转义字符/接续字符
c语言学习笔记(6)注释符号,接续符号和转义符号的用法_漫步的风暴的博客-CSDN博客
C语言 接续符和转义符_华哥-2088的博客-CSDN博客_连接符
转义符是主要用于表示无回显字符(主要用法),也用于表示常规字符(正常用单引号表示即可,这种方式其实绕了一遍),转义符必须放在单引号或者双引号里面。
注意:反斜杠后面可以接八进制或者十六进制来表示字符,但是不能接十进制来表示字符。
接八进制时不要超过八进制能表示的范围,比如'89',会出错。
' '就表示空字符,后面的0实际上是八进制数。
C语言字符型char和整型int的关系和示例_C语言技术网-码农有道的博客-CSDN博客_c语言整型和字符型的区别
char a = 0; char b = '0'; printf("a = %dn",a);//a = 0 printf("b = %dn",b);//a = 48总结来说就是,整型可以接收字符,底层是以字符对应的ASCLL码来存储的,不过你可以根据需要用数字或者字符的形式来展示(0~255范围内可互转)。
超出范围会循环,比如给int a = 304,也就是255+49,以%c形式输出时是a是0
计算机进制
【最强干货】详解二进制,八进制,十进制,十六进制的相互转换_哔哩哔哩_bilibili
进制转换(二进制、八进制、十进制、十六进制)涵盖整数与小数部分,超详细_DJL微光的博客-CSDN博客_进制转化表
在线进制转换器 | 菜鸟工具
比较好理解的几个转换:十进制到其他进制,其他进制到十进制,十六进制八进制和二进制之间
ASCLL码
ASCII_百度百科
ASCLL码是用7位或者8位二进制数来表示一些字符。
注意:单引号表示字符,双引号为字符串。
注意区分十进制的0和字符0;十进制的0对应字符的空字符;字符0对应的十进制数是48。
计算机单位
b、B、KB、MB、GB 的关系?_ITROOKIEIS的博客-CSDN博客_b kb mb
三种程序结构
C语言之三种基本结构_WongKyunban的博客-CSDN博客_c语言的三种基本结构
C语言for循环详解_风叶翩翩的博客-CSDN博客_c语言for循环
顺序结构
顺序结构
最浅显的顺序结构:三种结构之一
(1)代码执行的时候如果没有遇到判断跳转或者循环,默认是顺序执行的。执行完上一句则开始执行下一句。
(2)顺序结构说明CPU的工作状态,就是以时间轴来顺序执行所有的代码语句直到停机。选择和循环结构内部的顺序结构
(1)譬如if(){}在{}内部是if的代码段,在代码段内部还是按照顺序结构来执行的。
(2)switch case内部也一样,也是按照顺序结构执行的。
(3)while for内部也是按照顺序结构来执行的。编译过程中的顺序结构
(1)一个C程序有多个.c文件组成,编译的时候多个.c文件是独立分开编译的。每个c文件编译的时候,编译器是按照从前到后的顺序逐行进行编译的。
(2)编译器编程时的顺序编译会导致函数/变量必须先定义/声明才能调用,这也是C语言中函数/变量声明的来源。
(3)链接过程中呢?应该说链接过程链接器实际上是在链接脚本指导下完成的。所以链接时的.o文件的顺序是由链接脚本指定的。如果链接脚本中明确指定了顺序则会优先考虑这个规则按照这个指定的顺序排布,如果链接脚本中没有指定具体的顺序则链接器会自动的排布。思考:为什么本质都是顺序结构?
(1)顺序结构本质上符号CPU的设计原理,CPU又是人设计的,所以CPU的设计符合人的思考原理
编程演进史
CPU需要的只是1和0组成的二进制数据
(1)不管编程怎么变,最终编程得到的可执行二进制程序都是给CPU运行的。CPU需要的只是按照CPU设计时的规律(机器指令)排布的一串二进制1和0组成的数字(机器码),CPU根本不关心这些二进制是怎么来的;
(2)这些二进制可能是一个很厉害的程序员直接用1和0拼出来的;也可以是用汇编语言编写最终编译得到的;也可以是用C语言编写最终编译得到的;也可以是用java C# php bash等语言编写然后解释得到的;
(3)编程工作的演进其实一直是在处理上一个层次段落:就是使用何种语言编写程序(用某种语言进行编程),然后如何把这种程序源代码转成二进制(编译器的发明);
(4)CPU接收到一串1010序列后如何工作达到目的,这就是设计制造CPU的公司要考虑的事情了,与软件工程师完全无关。
早期的纸卡打孔编程者
(1)最早期的时候,CPU也很简单,指令集很少,二进制位数也不多。那时候编译器也没被发明,编程语言也没被发明,那时候就是用二进制直接编程的。
(2)最早的编程没有语言也没有编译器,程序员直接使用二进制和机器(CPU)对话。
(3)这种方式的坏处就是不容易扩展,随着CPU的进一步复杂化,指令的变多,指令位数的变多,编程难度呈几何倍数增长。人的大脑慢慢就跟不上这个节奏。
编程工作的第一次革命:由二进制机器码到汇编语言
(1)第一次革命就是:发明了汇编语言。汇编语言的本质就是用一个符号来代替一串二进制。
MOV 10101010101010
SUB 01010101010101
(2)有了汇编语言之后,程序员就不用再去记忆二进制序列了。编程时只需要用汇编指令来编程即可,汇编指令就是一个符号(符号就是由文字构成的,如MOV)。因为人类大脑天生对文字符号更加友好,因此用符号编程更简单。
(3)用汇编语言编写的源程序不能直接给CPU运行,必须通过一个翻译过程,把源代码翻译成二进制序列才能给CPU。这个翻译的过程就叫汇编,执行翻译动作的就是汇编器。
编程工作的第二次革命:由汇编语言到C语言
(1)汇编语言也有一些不尽如人意的地方,譬如:没有可移植性。在这个CPU上写的汇编程序无法直接在另一个CPU上运行。因此汇编语言是和CPU一一对应的。
(2)为了可移植性于是乎发明了高级语言。第一个高级语言就是C语言。C语言进一步靠近人的思维,为人的思维发明了很多CPU没有的东西,譬如数组。最终的目的就是降低编程难度,让高级语言更接近人的思维,然后通过编译器、汇编器等的翻译将这些源代码变成二进制然后给CPU运行。
革命无穷尽、层次变更多
在C语言之上还有更高级语言,譬如:C++、Java、C#、bash等。越往上越靠近人的思维,越往上语言本身提供的封装越多,越往上编程难度越低、语言的掌握越容易。
CPU需要的只是1和0组成的二进制数据
(1)不管编程怎么变,最终编程得到的可执行二进制程序都是给CPU运行的。CPU需要的只是按照CPU设计时的规律(机器指令)排布的一串二进制1和0组成的数字(机器码),CPU根本不关心这些二进制是怎么来的;
(2)这些二进制可能是一个很厉害的程序员直接用1和0拼出来的;也可以是用汇编语言编写最终编译得到的;也可以是用C语言编写最终编译得到的;也可以是用java C# php bash等语言编写然后解释得到的;
(3)编程工作的演进其实一直是在处理上一个层次段落:就是使用何种语言编写程序(用某种语言进行编程),然后如何把这种程序源代码转成二进制(编译器的发明);
(4)CPU接收到一串1010序列后如何工作达到目的,这就是设计制造CPU的公司要考虑的事情了,与软件工程师完全无关。
早期的纸卡打孔编程者
(1)最早期的时候,CPU也很简单,指令集很少,二进制位数也不多。那时候编译器也没被发明,编程语言也没被发明,那时候就是用二进制直接编程的。
(2)最早的编程没有语言也没有编译器,程序员直接使用二进制和机器(CPU)对话。
(3)这种方式的坏处就是不容易扩展,随着CPU的进一步复杂化,指令的变多,指令位数的变多,编程难度呈几何倍数增长。人的大脑慢慢就跟不上这个节奏。
编程工作的第一次革命:由二进制机器码到汇编语言
(1)第一次革命就是:发明了汇编语言。汇编语言的本质就是用一个符号来代替一串二进制。
MOV 10101010101010
SUB 01010101010101
(2)有了汇编语言之后,程序员就不用再去记忆二进制序列了。编程时只需要用汇编指令来编程即可,汇编指令就是一个符号(符号就是由文字构成的,如MOV)。因为人类大脑天生对文字符号更加友好,因此用符号编程更简单。
(3)用汇编语言编写的源程序不能直接给CPU运行,必须通过一个翻译过程,把源代码翻译成二进制序列才能给CPU。这个翻译的过程就叫汇编,执行翻译动作的就是汇编器。
编程工作的第二次革命:由汇编语言到C语言
(1)汇编语言也有一些不尽如人意的地方,譬如:没有可移植性。在这个CPU上写的汇编程序无法直接在另一个CPU上运行。因此汇编语言是和CPU一一对应的。
(2)为了可移植性于是乎发明了高级语言。第一个高级语言就是C语言。C语言进一步靠近人的思维,为人的思维发明了很多CPU没有的东西,譬如数组。最终的目的就是降低编程难度,让高级语言更接近人的思维,然后通过编译器、汇编器等的翻译将这些源代码变成二进制然后给CPU运行。
革命无穷尽、层次变更多
在C语言之上还有更高级语言,譬如:C++、Java、C#、bash等。越往上越靠近人的思维,越往上语言本身提供的封装越多,越往上编程难度越低、语言的掌握越容易。
像编译器一样思考
(1)编译器降低了编程难度。编译器的代表就是编程语言,每一种编程语言都有对应的编译器,这个编译器的作用就是把这种语言的源文件编译成可执行程序。
(2)关键是:有了编译器(高级语言)之后,我们程序员就不再盯着CPU(二进制),而是改为盯着编译器(编程语言、编程语言的语法),所以我们学习编程的关键变成了学习编译器的习性,也就是编程语言的语法。发明一门语言关键就在于发明它的编译器
(1)编译语言的关键就是编译器。yacc和lex工具就是用来发明编程语言的。高级语言与低级语言的差别
(1)越高级的语言越靠近人类思维;越低级的语言越靠近机器的需要。
(2)人与机器总劳动量(总复杂度)守恒。人要是复杂一点机器就可以简单一点;人简单一点机器就需要复杂一点。这个规律描述的就是:编程语言越简单,人使用起来越简单,编译器设计起来就更复杂;编程语言越复杂、程序员使用起来越麻烦,则编译器设计越简单,CPU执行效率越高。



