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

---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由运算器、控制器、寄存器等器件组成,这些器件靠内部总线相连。https://i-blog.csdnimg.cn/blog_migrate/6da227dc9732e6624c307708d7510448.png

区别:

内部总线实现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。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

乘螺舟而至

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值