C语言基础概念

96 阅读8分钟

计算机语言,简而言之,是人类与计算机进行交流的特殊语言, 目前已知的计算机语言可达上千种,例如:C++/Java/Python等等, 人们通过用这些计算机语言写的程序给计算机下达指令,使计算机完成特定的任务

C的历史与辉煌:

简单说来,那是在1969年时,贝尔实验室的肯·汤普森(Ken Thompson)与丹尼斯·里奇 (Dennis·Ritchie)用汇编语言开发了Unix操作系统,为了移植到其他计算机,汤普森就 在 BCPL语言的基础上开发了B语言。1972年,丹尼斯·里奇与布莱恩·柯林汉(Brian·Kernighan)又在B语言的基础上设计了C语言;于是,不仅Unix被用C语言重写,还被用于各种操作系统与系统软件的开发。

blog-image-orion-penzias-wilson-j.width-640.webp

一直到1988年,美国国家标准协会(ANSI)正式将C语言标准化,标志着C语言开始稳定和规范化。一直到今天C语言还是广泛被使用的计算机语言

screenshot-1764828756989.png 首先,C语言是编译性的语言,但其编译机制并不复杂。 由于计算机只认识0与1两个数字(这涉及到逻辑电路与计算机组成原理等专业知识,本人水平有限,了解不深。)so,计算机只能运行二进制的文件,这时,编译器便派上了用场,将C源代码转换为机器语言代码(01字符串代码),将其放在目标代码文件中,再由链接器将你所编写的目标代码与标准启动代码(充当什么程序与操作系统的接口什么的不太清楚)和库代码(C标准库中函数的代码)整合成为可执行的代码。

main函数: main函数为C语言的主函数也叫入口函数,这再熟悉不过了,它为程序的入口,它前面的int为函数的返回类型,表示函数在执行结束时会返回一个整数类型的值;所以在函数的最后有一个(return 0;),正好前后呼应;重要的是main函数有且仅有一个,当然,哪怕一个项目中有多个.c文件,也仅有一个main函数。

int main(int argc, char *argv[]),这是一种不太常见的写法,我甚至认为这毫无意义。这样写大抵是想告诉你其实main函数是可以有参数并且存在它的意义的,额······,要用的时候再说吧。

库函数: 为了不再重复实现常见的代码,提升程序员的开发效率,C语言标准规定了一组函数(printf、scanf、strlen......),规定了诸如:函数名、参数、返回类型以及函数功能等等,这些函数再由不同的编译器厂商根据标准进行实现再提供给程序员使用,这些函数组成了一个函数库,被称为标准库,这些函数被称为库函数。不过,有些编译器厂商会额外扩展提供部分函数,因为这些库函数会进行分类分为不同的系列,同一系列的库函数会被声明在同一个头文件中,所以库函数的使用必须要包含对应的头文件。 cplusplus.com/reference/c…

关键字: C语言中有一些保留名字的符号,例如:int、if、return,这些符号被称为保留字或者关键字,每个关键字都有其特殊的含义,是保留给C语言使用的,程序员自己在创建标识符时不能和关键字重复且关键字不能自己创建。 cppreference.cn/w/cpp/keywo…

screenshot-1764854970849.png

字符与ASCII编码: 在C语言中由单引号括起来的叫字符,在计算机的世界中,所有的数据都是以二进制的方式被处理并存储的,那这些特殊的字符在内存中都是以怎样的二进制形式存储的呢?或许可以给每个字符都编写一个二进制序列(编码),为了统一,美国国家标准学会(ANSI)制定了一个标准ASCII编码,C语言中的字符就遵循了ASCII编码方式。

image.png 此表不需要记忆,理解即可,要用时看看,有个大致的印象就完事了!不过这个ASCII码表的发明者的确是个天才。 {1.printf("%c\n",'a'); / 2.printf("%c\n",97);},那么,很显然1与2的运行结果一致,都为a。 当然,你甚至可以打印出所有可打印字符。

75fe1ba1-642a-42c0-89ae-e2b94843fe6a.png

字符串和\0: 使用双引号括起来的一串字符叫字符串(废话,凑字数🤓);

fae5382e-cf39-4cbf-b4ba-62411e8a8604.png

由此,我们可以得知在C语言的字符串末尾总是隐藏着一个\0字符,而这个\0字符便是字符串结束的标志。 所以,我们在利用printf()打印字符时遇到\0时就自动停止。不过在利用strlen()计算字符串长度时并不包括\0,所以xysjy的字符串长度为5,最后,(char arr[]={'x','y','s','j','y','\0'};),末尾若无\0则运行会出现乱码,简单来说就是没有\0会一直识别数组后面未被赋值的内存空间中的信息直到出现\0为止,当然,这样字符串的长度便是一个错误且随机的值。(char arr[]="xysjy";),明明可以这样。

转义字符: 像\0、\n这样,只要在字符前面加一个\,便可以改变字符原有含义并实现新的功能,这就是转义字符,很简单。

822a856e-5098-486e-bdc1-26f32fccdb8e.png

c2f0470e-9660-4055-940e-89d14369d2e5.png

从一个普通的字符n加上\转变为换行符。

其实\?与?根本就是一个意思,早期时由于连续问号有其特殊意义...... ,算了,解释不清,直接上图。

image.png

简而言之,你若是要打印单纯的问号而不是由三字母词解析而来的字符就要在?之前加上\。 但其实这根本无关紧要甚至没有意义。

\'、\"、\\不用多说。\a还有点意思,它表示警报,打印\a会使得终端发出警报声或出现闪烁或者两者都发生,不过我依然觉得这用处不大。

\b:退格符,光标回退一个字符但不删除字符。

919ce054-d697-4031-a45a-1d9e252fea11.png

回退一格再打印就将s这个字符覆盖掉了但并不将其删除若xys\b之后没有任何字符,则打印出xys。\r:回车符,光标移到同一行的开头,知道就好。\t:制表符,这个解释起来就是相当于用空格补齐8或4的整数倍个单位,假如在ab后面加入一个\t(ab\t),则最后打印的结果会在ab的后面多出6个空格,即为补全为8的整数倍个单位(一定是最小整数倍)。

30bce9b3-f883-45d1-b3bb-04033cdb57f5.png

用于打印空格使信息对齐。

最后,我们在一到三个八进制数字前面加上\可以将其转换为十进制数,在2个十六进制数字前面加上\x也可将其转换为十进制数字。\0:null字符,代表没有内容(字符串结束标志),ASCII码值为零。 cppreference.cn/w/c/languag…

语句:代码就是由一条一条的语句组成的,也就几类。

1空语句就是只有一个;的语句,必须得有一条语句但不需要起到任何作用时可以使用它。 2.表达式语句由表达式和;组成,例如(int a =1;)。3.函数调用语句:函数调用时加上;就是函数调用语句。

4e3ccb18-4a50-4991-828c-f0695f03f6a7.png

复合语句:成对括号中的代码就构成代码块,也被称为复合语句(通常是{}所包裹的代码块)。

5d2ecf79-bf59-4a56-9c6b-97ef72be807b.png

控制语句:c语言是一种结构化的程序设计语言且支持三种结构:顺序结构、选择结构、循环结构。 选择结构:if/switch语句。循环结构:for/while/do while循环。

为了实现这些结构方式,设计了九种控制语句用于控制程序的执行流程:

1.条件判断语句(分支语句):if/switch语句。

2.循环执行语句:while/do while/for语句。

3.转向语句:break/goto/continue/return语句。

注释:

注释用于对代码进行解释,它是面向程序员的,对实际代码的编译运行无任何影响;它的意义在于帮助程序员更好的理解代码,对代码的后期维护和修改具有重要意义,提高工作效率,总之,这是个好习惯,不过也不要过度注释。注释方式有两种:

  1. /**/用于多行注释:

/*..........

..........*/

  1. //用于一行注释:

//..........

就这样吧,第一次写,主要是记录学习过程和个人心得。

我曾经以为时间是最好的良药,任何伤痛,任何失落终究会在岁月的流逝中淡化,于是我选择了等待,等待时间慢慢冲淡心里的伤痕,可是渐渐的我才明白,时间并不一定能治愈一切,我以为时间能抚平所有创伤,哈哈哈哈哈,最后反而在岁月的打磨下变得更加深刻。

share_38fe99c197b99fe17c228e66b609ed29.png