---2019/2/22·

用一周时间重新复习了一下C语言,今天把笔记部分记录在这里,方便日后查看。

【第一章】 计算机与程序设计概述

“工艺的乐趣”:一,因为制造自己设计的东西而快乐;二,因为制造了对他人有用或受他人尊敬的东西而快乐;三,因为用迷宫一样复杂的对象构建系统并使之正常运行而快乐;四,因为工作非重复性的本质可以不断学习而充满乐趣;五,因为能够自如驾驭自己手中的工具工作而快乐。

  • 计算机硬件包括:
  1. 主存储器(主存)
  2. 辅助存储器(外存),包括硬盘、CD、DVD和U盘等存储设备。
  3. 中央处理器。
  4. 输入设备,例如键盘、鼠标、触摸板、扫描仪、操纵杆。
  5. 输出设备,例如显示器、打印机和扬声器。

·存储器

存储单元:存储器中的单个存储位置。

存储单元地址:存储单元在计算机主存中的相对位置。

存储单元由字节构成。字节(byte)是存储单个字符(如H)所需要的空间,每个存储单元的字节数因计算机而异。字节由位(bit)构成,它是计算机能够处理的最小单元。每一位为0或者为1,通常8位构成一个字节。

·主存储器

RAM(随机存储器):它可以暂时存储程序与数据。

ROM(只读存储器):主存中能永久储存程序或数据的部分。

·中央处理器(CPU)

两个作用:1.协调所有计算机操作;2.实现数据的算术与逻辑运算。

CPU的当前指令和数据由成为寄存器的高速存储区暂时存储在CPU内部。

一个典型的CPU由运算器、控制器、寄存器等器件组成,这些器件靠内部总线相连。

区别:

内部总线实现CPU内部各个器件之间的联系。

外部总线实现CPU和主板上其它器件的联系。

CPU访问内存单元时要给出内存单元的地址,所有的内存单元构成的存储空间是一个一维的线性空间。

我们将这个唯一的地址称为物理地址

·计算机网络

局域网(LAN):计算机、打印机、扫描仪和外存设备为了相互通信而通过电缆连接就构成局域网(LAN)。

文件服务器:网络中控制对辅助存储器(如硬盘)存取的计算器。

广域网(WAN):像因特网这样的网络,在很大地域范围内连接计算机和局域网。

万维网(WWW):因特网的一部分,它的图形用户界面使得网络资源变得容易存取并可在其间漫游。

图形用户界面(GUI): 为了让用户选择命令和数据而显示的图片和菜单。

如果为计算机配备一个调制解调器,那么就可以通过电话线、电视或光缆连接信息高速公路。调制解调器可以将计算机的二进制数据转换为音频信号,然后通过普通的电话电路传递到另一台计算机。

DSL连接:一种使用电话线的高速因特网连接,不会影响同一线路上同时进行的声音交流。

电缆因特网接入 通过同轴电缆上的两条信道进行双向高速因特网数据传输,该同轴电缆具有数百个信道,可以传输有线电视信号。

·计算机软件

操作系统(OS) 控制用户和计算机硬件交互,并管理计算机资源分配的软件。

通常操作系统的一部分永久储存在只读存储器(ROM)芯片中,因此只要计算机一启动,这部分操作系统就运行了,计算机可以读取只读存储器中的数据,但是不能向芯片中写数据。操作系统中基于ROM的一部分包含了将其余操作系统代码(这部分驻留在硬盘上)载入内存所需要的指令。将操作系统载入内存的过程称为BOOT(booting a computer)

·计算机语言

机器语言 能被具体的CPU理解的二进制数代码。

汇编语言 机器语言指令对应的助记码。

高级语言 将代数表达式和英语符号组合在一起的独立于机器的编程语言。

·高级语言程序的执行过程

编译器(compiler) 将高级语言程序翻译为机器语言的软件。

源文件(source file) 包含一个用高级语言编写的程序的文件,是编译器的输入。

语法(syntax) 一种编程语言的语法规则。

目标文件(object file) 从编译器输出的机器语言指令文件。

链接器(linker) 链接器程序将预制的函数和目标文件结合在一起,产生完整的可运行的机器语言程序,即产生.exe文件。

运行程序时,加载器将可执行文件的所有指令从硬盘复制到内存中,并指示CPU从第一条指令开始执行。

集成开发环境(IDE) 结合字处理器、编译器、链接器、加载器和查错工具的软件包。

【第二章】C语言概述:

·预处理指令 以#开始的为预处理器提供指令的C程序行。

预处理器 在C程序编译前对其进行修改的系统程序

库(library) 可以被程序访问的一些实用函数和符号的集合。每个库都拥有一个文件名以符号.h结尾的标准头文件。

预处理指令语法:

·定义常量宏语法:

·主函数(main函数)定义

·void关键字使用规则:
一,函数没有返回值,则应声明为void类型

因为在C语言中,凡不加返回值类型限定的函数,就会被编译器作为返回整型值处理。

二,如果函数无参数,那么应声明其参数为void。

如int main(void)表示主函数在开始执行前不从操作系统接收数据。

·C数据类型

·C的数值常量被认为是非负数值。尽管在程序里可以使用一个像-10500这样的数字,但是C会将负数符号看做是取反运算符。

int,整数,但由于一个存储单元的大小有限,但由于一个存储单元的大小是有限的,故其范围在-32767和32767之间。

double,实数,实数有一个整数部分和一个小数部分,并由小数点分隔开。

科学计数法表示实数实例:1.23e5 或 1.23E5;0.34e-4(0.000034),科学计数法的double型常量可以没有小数点,如12e+5。

char,表示一个字符值——字母、数字或专用符号。每个char值必须包含在撇号(单引号)内。

·用户定义标识符原则

  1. 标识符只能由字母、数字和下划线组成。
  2. 标识符不能以数字开始。
  3. C保留字不能用作标识符。
  4. 在C标准库中定义的标识符不能被重新定义。

建议使用标识符风格:如dollars_per_hour或lbs_per_sq_in

·变量声明语法:

·赋值语句语法:

·printf函数

格式字符串占位符

格式字符串:调用printf时,包含在引号内的字符串,用于指定函数输出格式。

占位符:在格式字符串中以%开始的符号,用于表明显示输出值的位置。

换行符转义序列:\n

·scanf函数

调用scanf时,每个待赋值的变量名前都有一个&符号。&是C中的取地址运算符。在该输入操作中,&告诉scanf函数到哪里寻找要存储新值的每个变量。如果省略&符号,scanf将只知道变量的当前值,而不是它在内存中的位置,因此scanf将不能再该变量中保存新值。

scanf中使用的输入字符的数目依赖于当前的格式占位符,占位符还可以反映存储数据的变量的类型。一个%c(char型变量)对应一个输入字符。对于%lf或%d(double型或int型变量)来说,程序首先跳过所有的空格,然后开始扫描多个字符,直到遇见一个不可能是该数值的一部分字符才结束。

·return语句

0被认为是主函数的执行结果,该值表明执行的程序没有错误。

混合类型赋值时,首先求出表达式的值,这一过程中,表达式: ace 算术运算符 bandage在两者全为int型的情况下为int型,否则就为double型,之后将该值赋给赋值运算符(=)左边的变量。

如:

int m = 3;

int n = 2;

double y;

y = m/n;

结果y = 1.0

将double型表达式赋给int型变量,会使得表达式的小数部分丢失。

·强制类型转换:将希望的类型写在表达式前的圆括号内,从而转换表达式的类型。

·单目运算符

单目运算符在同一个子表达式中以及相同优先级内(如+和-)按从右向左进行运算。

·格式化数值

在占位符%d的%与d之间加一个数指定域宽——显示一个数值所需的列数。

当域宽大于数值列数时,会在数值之前用空格补齐。

负号也占一个列。

例:

double类型的格式化还需指明小数位的数目,格式为%n.mf,n为表示整个域宽的数,m是希望的小数位的数目。显示的数值会被四舍五入为m位小数。

例:

如果使用类似%.mf的占位符只指明小数位的个数,那么显示的值中将不会有前导空白。

例:

·常见编程错误

  1. (syntax error)语法错误:在程序翻译(编译)过程中检测到违反C语言语法规则的错误。
  2. (run-time error) 运行时错误:试图执行一个非法操作,在执行过程中被检测到(如除以0)

·输入与输出重定向

函数fopen用法:

  1. FILE *fopen(const char *path, const char *mode);
  2. FILE *inp;

Inp = fopen(const char *path, const char *mode);

path包含文件路径及文件名,参数mode字符串则代表着流形态。

C语言中如果文件与源文件在同一个文件夹内,则不需指明路径。

数据流:以规定顺序被读取一次的数据序列。

又如:
FILE *fphzk
fphzk=("c:\\hzk16',"rb")
其意义是打开C驱动器磁盘的根目录下的文件hzk16, 这是一个二进制文件,只允许按二进制方式进行读操作。
两个反斜线“\\ ”中的第一个表示转义字符,第二个表示根目录。使用文件的方式共有12种,下面给出了它们的符号和意义

函数fclose用法:

int fclose(FILE *stream);  该函数返回一个整数,当文件关闭成功时,返回0,否则返回一个非0值。

函数fprintf用法:

int fprintf (FILE* stream, const char*format, [argument])

FILE*stream:文件指针

const char* format:输出格式

[argument]:附加参数列表

例:基本用法同printf。

函数fscanf用法:

int fscanf(FILE * stream, const char * format, [argument...]);

其功能为根据数据格式(format)从输入流(stream)中读入数据(存储到argument);

例:

【第三章】函数自顶而下设计

步骤一:分析问题,将问题分开成为若干的子问题,按照先后或并列的逻辑组织这些问题。

步骤二:制定顶层函数设计,用框图的形式表达,写出每一个函数的具体作用,用注释的方式列出函数的数据需求,其中包括:1.问题常量  2.问题输入  3.问题输出  4.相关数据结构与公式

步骤三:根据每一个函数的数据需求细化地编写每一个函数。

·库函数:

用#include <math.h> 语句引入数学库函数

定义与调用无参函数

function prototype

定义:void draw_circle(void);

调用:draw_circle();

·双反斜杠\\在格式字符串中表示单反斜杠\

·带输入参数的函数

实参:在函数调用括号内的表达式,它的值被传入函数并和函数的对应形参关联。

形参:在函数定义中表示对应实参的标识符。

一:带输入参数和单一结果的函数

函数接口注释实例:
/* Pre: n is defined. 此为前置条件,即函数调用前为真的条件。

二,带多个参数的函数

通常要保证参数表的一致性,要求函数调用中实参的数目必须与函数原型中形参的数目一致,保证不会有信息丢失。

为了检验函数编写的正确性,可以使用驱动测试函数,即通过定义函数参数、调用函数并显示返回值才测试函数的一个小程序。

【第四章】 选择结构

关系运算符:

逻辑运算符:&&(与)、||(或)、!(非)

逻辑运算符可以作用于数上,C语言对逻辑表达式求值的结果总是为0或1。但C语言认为任何非0值代表true。

注:&&(与)的优先级高于||(或)

C语言中存在短路求值现象,要注意。

短路求值:只要逻辑表达式的值能够确定就停止对表达式求值。

ex:

·C语言中也可以使用关系运算符和判等运算符来比较字符。例:

if语句:

风格参考

if (条件)  {

条件为true时的任务

}

else  {

条件为false时的任务

}

内聚函数:执行单个特定操作,在程序中可被复用的函数。

编写内聚函数是一种良好的编程风格。

在进行顶层设计的时候,可以考虑采用数据流的形式,对问题进行分析与设计。

数据流信息是系统文档很重要的一部分,因为它表明了每个算法步骤处理的程序变量,以及处理这些变量的方式。

如:

·嵌套if语句结构

·多选项if语句结构

注:C语言会将else和最近一个不完整的if相关联。

switch语句:

条件表达式只能是int或者char类型,不可是double类型。包含double类型或字符串值的case标签是不允许的。

如果没有break语句,程序执行将“贯穿”到下一个选项。

·使用switch语句时,为了防止整个switch语句被跳过,可添加default标签默认执行回显语句,方便后期进行查错。

注if(!x) 语句1; 指:当x为0时,执行语句1。

《C语言详解》_by_Hanly.学习笔记(1)相关推荐

  1. 《Node.js开发实战详解》学习笔记

    <Node.js开发实战详解>学习笔记 --持续更新中 一.NodeJS设计模式 1 . 单例模式 顾名思义,单例就是保证一个类只有一个实例,实现的方法是,先判断实例是否存在,如果存在则直 ...

  2. 《Linux设备驱动开发详解》学习笔记一

    Linux设备驱动开发详解学习笔记<一> 书名:<Linux设备驱动开发详解>第二版 主机环境:Linux version 2.6.25-14.fc9.i686@Fedora ...

  3. 《Windows驱动开发技术详解》学习笔记

    Abstract   如果推荐 Windows 驱动开发的入门书,我强烈推荐<Windows驱动开发技术详解>.但是由于成书的时间较早,该书中提到的很多工具和环境都已不可用或找不到,而本文 ...

  4. 《ABAQUS有限元分析实例详解》学习笔记_51CAE_新浪博客

    石亦平老师的<ABAQUS有限元分析实例详解>当属ABAQUS学习的经典著作,一边认真拜读一边在此写下点滴笔记,供自己参考. 1.ABAQUS/CAE并没有自己专用的量纲系统,用户建立的整 ...

  5. mysql select语句详解_mysql学习笔记之完整的select语句用法实例详解

    本文实例讲述了mysql学习笔记之完整的select语句用法.分享给大家供大家参考,具体如下: 本文内容: 完整语法 去重选项 字段别名 数据源 where group by having order ...

  6. git cherry-pick 详解 —— Git 学习笔记 18

    git cherry-pick 详解 初识 git cherry-pick(拣选) 拣选会提取某次提交的补丁,之后尝试将其重新应用到当前分支上. 这种方式在你只想引入特性分支中的某个提交时很有用. 假 ...

  7. git checkout 命令详解—— Git 学习笔记 16

    git checkout 命令详解 概览 git checkout 这条命令的常用格式如下: 用法一 git checkout [<commit>] [--] <paths> ...

  8. TCP/IP协议基本概括+ARP协议详解+DNS协议详解---Linux学习笔记

    TCP/IP协议的体系结构: TCP/IP协议族四层模型和OSI七层模型 上层协议使用下层协议的服务,下层协议给上层协议提供一个接口. 四层模型中各个层次的作用和特点 上图说明: 最底层是数据链路层, ...

  9. IP协议详解---Linux学习笔记

    网络层概述: IP服务的特点: IP协议为上层协议提供无状态.无连接.不可靠的服务. 无状态:IP通讯双方不同步传输状态的信息,因此所有IP数据报发送.传输.接收都是相互独立的,没有上下文关系.这样同 ...

  10. 《TCP/IP详解》学习笔记(五):IP选路、动态选路

    静态 IP 选路 1一个简单的路由表 选路是 IP 层最重要的功能之一.前面的部分已经简单的讲过路由器是如何根据 IP 数据包的 IP 地址来选择路由的. 这里就不重复了. 首先来看看一个简单的系统路 ...

最新文章

  1. 程序员成功之路 ——The road ahead for programmer(转引)
  2. UntraEdit 语法高亮 (MSSQL)
  3. vue点击网页全屏_vue-cli点击实现全屏功能(两种方式)
  4. ffmpeg为AVPacket添加解码头信息
  5. 【有三说深度学习】深度学习前夕
  6. Scala 语言之模式匹配(6)
  7. mysql函数创建与使用_mysql function函数创建与应用方法
  8. mongo更新数组字段_更新mongodb中嵌套数组中的几个字段(使用pymongo)
  9. 傻子都能看懂的马拉车Manacher
  10. netty消息分发思路
  11. Spring MVC接受参数的注解
  12. java hacker code_我陷入了Java的第一个hackerrank挑战
  13. 引入阿里iconfont图标方法以及注意事项
  14. 机器学习方法之非线性回归( Logistic Regression)
  15. android 图片缩放工具,批量图片缩放软件下载-批量图片缩放 安卓版v1.3.1-PC6安卓网...
  16. 当我们谈论智能手表时,我们在谈论什么?
  17. 2015-2023年全球医疗器械公司100强(附细分领域排行)
  18. 智能匹配 — 百度SEM
  19. python可视化的优势_「数据可视化」数据可视化的优势有哪些?
  20. IDEA-Translation3.0插件右键无文档翻译解决

热门文章

  1. unity3d 毛笔笔锋
  2. java phaser,java线程之Phaser
  3. bilibili 弹幕协议分析,golang 还原代码
  4. c语言srand函数作用,C语言中srand随机函数怎么用?
  5. JAVA(图形界面)
  6. Android调用手机自带图库选择图片
  7. UVALive 4670 Dominating Patterns(AC自动机)
  8. 格林尼治时间与本地时间转换
  9. mongodb update操作
  10. 原生JS实现addclass