C语言学习笔记

丹尼斯里奇和另一个我不记得名字的大神想要在UNIX系统上玩个小游戏,并因为大型机不方便,想在小型机上自己写一个系统,先将BCPL简化为 B语言,又经过改进,诞生了早期的C语言,所以C语言的历史其实也就是UNIX的历史。(如今的MAC OS,LINUX,ANDROID都是基于UNIX系统,第一个高级语言是FORTRAN,没有A语言)
所以只要计算机体系结构不变,C语言就经久不衰

计算机语言

计算机语言上描述要求它如何做事情的过程和方法
汇编语言、低级语言:面向机器,贴近计算机。
高级语言:任何型号的计算机都适用,有基于过程的结构化和非结构化语言,也有面向对象语言。(C语言是完全模块化和结构化的语言)
解释语言,编译语言:执行方式不同,目前性能也已不再是问题。

程序设计

程序结构

预处理指令 #include<>
全局声明
函数定义,从main函数开始执行

运行步骤

1,输入程序代码,生成.c文件-源程序文件
2,编译,预处理获取头文件,检查语法错误,将源程序转换为二进制的目标程序,生成.obj文件
3,连接处理,一次编译得到一个obj文件,只是程序的一部分,需要把边以后得到的所有文件和模块装配起来再与函数库相连生成.exe文件-可执行程序

程序设计的一般流程

首先我们要搞明白什么是程序,程序=算法+数据结构,其中算法是对操作的描述,数据结构是对数据的描述。
程序设计的一般流程如下:
问题分析->设计算法->编写程序->对源程序进行编辑,编译和连接->运行程序,分析结果

一些知识

运算符

运算优先级

\\关系运算符优先级比算术运算低
()
!,+,-,++,--作为单目运算符
*,\,%
+,-
<,<=,>,>=
==,!=
&&,||
? :三目运算符,条件?满足:不满足,高于赋值运算符,低于其他运算符
=,*=,+=等
,逗号运算符,连接两个表达式,用右边的作为结果

逻辑运算由左至右,左边可以确定运算结果的右边不计算,比如&&运算已知左为0,右边的表达式不会被计算,我们称之为“短路”,需要注意。
++,-- 递增递减对应机器指令中的INC和DEC,在C诞生之初可以加快运算,但如今已失去意义,+=,-=,*=,=同理,C在诞生之初就是要表示所有的机器指令,因此才有上述表达式,如今都可以算做糟粕。

程序结构

基于过程的三大结构——顺序,选择和循环结构,if嵌套,while(条件)满足就做,for(i;i<n;i++)已知循环次数使用,都没啥说的,用的少的switch注意一下,语句从case进入后,顺序执行,所以需要写break跳出。

函数,数组,地址

函数写在后面需要提前声明,一个函数一个返回值;调用值与函数规定的不匹配时会自动转换,但会导致很多不可知的问题。数组初始化必须限定好个数,动态需要借助指针——int *a=(int*)malloc(n*sizeof(int))指针指向开辟的内存,C99之前需要这么操作,现在的可以用new,int *a=new int[n]地址用于解决函数参数值传递时只有一个返回值的问题,通过地址传递指针变量可以一次修改多个变量的值,达到返回多个值的目的;以及大量数据需要做参数时(比如数组);还有上面提到动态申请内存时的应用;与数组的关系,数组名就是指向第一个数据的地址,但数组初始化后不可使用a[]的方式修改,因为int a[]=int* const a与字符串char *s表示指向char的指针变量,可以当做string使用,但是更宽泛,同样的char s[]也是此效果,但一般的,处理时我们使用char *s,构造时我们使用char s[]

写在后面

通过课程学习和目前的接触,C++现在都早已不是主流,C的应用则更少,目前多应用于操作系统,嵌入式,驱动程序,引擎,底层驱动和一些工业场景,日常较少使用,使用他编写代码也少了些乐趣,更需要我们不断学习。
但是我们为什么还要学C呢,就是因为他的历史悠久,目前的语言大多是Clike的,也就是语法接近C,可以说是C的简化版,我们学了C以后再转到其他语言就能更游刃有余,所谓求其上者得其中。
此外C还有啥优点呢?直接对内存操作,说是更自由,但是需要很高的门槛,还容易导致溢出等问题;开发者面对过多底层逻辑,开发效率低,总得就是没啥好用也,人生苦短呀。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值