• 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文件-可执行程序

    程序设计的一般流程

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

    一些知识

    运算符

    运算优先级

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

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

    程序结构

    基于过程的三大结构——顺序,选择和循环结构,if嵌套,while(条件)满足就做,for(i;i

    函数,数组,地址

    函数写在后面需要提前声明,一个函数一个返回值;调用值与函数规定的不匹配时会自动转换,但会导致很多不可知的问题。数组初始化必须限定好个数,动态需要借助指针——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还有啥优点呢?直接对内存操作,说是更自由,但是需要很高的门槛,还容易导致溢出等问题;开发者面对过多底层逻辑,开发效率低,总得就是没啥好用也,人生苦短呀。

  • 相关阅读:
    MATLAB算法实战应用案例精讲-【图像处理】SLAM技术详解
    解绑数字身份,解锁新玩法与构建方式(下)
    快速开发微信小程序之一登录认证
    Java设计模式之单例模式
    【gitlab】git push -u origin master 报403
    案例(部门管理和员工管理)-(2)
    [媒体宣传]上海有哪些可以邀约的新闻媒体资源汇总
    Spring系列-SpringMvc父子容器启动原理解析
    力扣练习,假设你有 n 个版本 [1, 2, ..., n],你想找出导致之后所有版本出错的第一个错误的版本。
    Java冒泡排序
  • 原文地址:https://blog.csdn.net/weixin_46763552/article/details/132910260