C语言-C premier plus 6 (前六章)笔记和复习总结

哈喽!写在前面的话:为了之后进一步学习,在家决定把C语言重新复习一遍。参考书是C premier plus 第六版。

第一章 概览

1.1 C的优点
自顶向下编程、可靠易懂、高效、可移植、较为灵活、面向编程人员

1.2 使用C语言七个步骤

1.定义程序目标
2.设计程序
3.编写代码
4.编译 
// 由C编译器来完成。(编译器的是指是一段程序,调用运行期linker将C库中函数加入代码中,并转换为可执行代码)
5.运行程序
6.测试和调试程序
//调试的过程成为debugging
7.维护和修改
//请尽量增添注释

1.3 目前的C环境
UNIX、Linux、MS-DOS、Windows、Macintosh OS

1.4 C中的文件及后缀

文件名解释
hello.chello是一个基本名,.c 是一个扩展名。代表该文件是一个源文件
hello.obj目标代码(由机器语言指令组成, 是经编译器编译过的代码)
hello.exe可执行代码(由机器语言指令组成,是一经过编译、链接后的机器能读懂的代码)
  • 编译器Compiler的任务:检查语法和逻辑,将程序转化为可执行程序

  • 链接器Linker 的任务:把目标文件和库文件链接成可执行文件

1.5 C标准

  • C89→C99→C11 标准
  • 1994年,C99基于C精神做出了一些更改。值得一提的是,目前大多数编译器没有完全实现所有C99的修改,只有在修改编译器的设置之后,才能看到一些C99的特性。
  • 2007年,委员会出于对当前编程安全的担忧,不那么强调“信任程序员”目标了。使得C99的一些特性成为 C11的可选项。

第二章 C语言概述

2.1一个C语言简单例子

/*simple one*/		//注释 ,注释有两种方式
//此处写注释的作用:给出了文件名和程序的目的,是一种程序说明,在后续的使用中比较便于管理

/* 方式一  注释块 */	
//方式二	 注释行


#include<stdio.h>	//预处理,作用相当于在文件中键入了文件stdio.h
#define PI 3.14159	//预处理,末尾不用加分号,因为这是一种由预处理器处理的替换机制。且PI要大写,为了提高程序的可读性。


//#include不是C语言的语句,#符号表明这一行是在编译器接手之前由C预处理器处理的语句,是一种预处理器指令
//stdio.h文件包含了有个输入输出的函数,以供编译器使用。出现在文件顶部,成为头文件。C通常要带很多头文件。


int main(viod)		//函数名,int表示返回整数,void表示函数不接受参数

//函数从main开始执行
//主函数的的返回值是返回给OS
//或许会有其他版本的比如: main()、int main()、void main()具体解释见下文。

{					//函数体的开始
	int num;		//声明语句,声明一个变量,它的类型是整型的
	num = 1;		//赋值

	printf(" this is a easy simple");			//函数调用,使用了printf()函数,函数名中的f提醒用户,这是一种格式化打印函数。其中的内容作为实参传入。
	printf(" \n");								//函数调用,\n表示另起一行,打印换行符的效果与在键盘按下Enter键相同
	printf("the value of num is %d \n", num);	//函数调用,%d相当于是一个占位符,其作用是指明输出num值的位置,%提醒 程序,要在该处打印一个变量
	return 0;									//return语句是返回语句,给调用它的主体返回一个值
}


解释1:
!main(){…} 形式:不写返回值类型也不写参数列表,这是C90的风格。

  • 1.不写返回值类型时 表示程序返回int型

  • 2.不写参数列表时 表示参数类型和个数没有明确指出。

这种写法会产生一些bug,但目前很多编译器还是支持的

  • 标准的:int main(int argc, char *argv[]) 或 int main(void) 其中 int
    argc, char *argv[] 是系统参数,一般不使用系统参数时,声明使用后者。
    除了这两种形式之外,以其它形式定义main函数都是错误的或不可移植的。

  • 如果遗漏 main()函数中的 return 语句,程序在运行至最外面的右花括号
    (})时会返回0。因此,可以省略main()函数末尾的return语句。但是,不要 在其他有返回值的函数中漏掉它。

2.2变量

起名:大小写字母、数字、下划线( 要注意程序的可读性,选取有意义的函数名和注释。)

声明:一条声明中可以声明一个、两个或多个变量。声明为变量创建和标记存储空间,并为其指定初始值

2.3关键字(总表)

关键字是C语言的词汇。
在这里插入图片描述
!粗体表示的是C90标准新增的关键字,斜体表示的C99标准新增的 关键字,粗斜体表示的是C11标准新增的关键字。

第三(四) 章 数据和C、格式化输入输出

3.1数据据类型关键字
在这里插入图片描述

  • 在C语言中,用int关键字来表示基本的整数类型。后3个关键字(long、
    short和unsigned)和C90新增的signed用于提供基本整数类型的变式,例如 unsigned short int和long
    long int。char关键字用于指定字母和其他字符(如, #、$、%和*)。另外,char类型也可以表示较小的整数。
  • float、double和 long double表示带小数点的数。_Bool类型表示布尔值(true或false),
    _complex和_Imaginary分别表示复数和虚数。

3.2.存储单元

  1. 位(bit):可以储存0或1(或者说,位用于设 置“开”或“关”)。虽然1位储存的信息有限,但是计算机中位的数量十分庞
    大。位是计算机内存的基本构建块。

  2. 字节(byte):是常用的计算机存储单位。对于几乎所有的机器,1字节 均为8位。这是字节的标准定义,至少在衡量存储单位时是这样

  3. 字(word):是设计计算机时给定的自然存储单位。对于8位的微型计算机(如,最初的苹果机),
    1个字长只有8位。从那以后,个人计算机字长 增至16位、32位,直到目前的64位。计算机的字长越大,其数据转移越快,
    允许的内存访问也更多。

3.3.基本类型

整数类型解释
intint类型是有符号整型,即int类型的值必须是整数,可以是正整数、负整 数或零。其取值范围依计算机系统而异。储存一个int不少于16位。
short int占用的存储空间可能比int类型少,常 用于较小数值的场合以节省空间。与int类似,short是有符号类型,至少16位。
long int占用的存储空间可能比int多,适用于较大数值的场合。与 int类似,long是有符号类型。
long long int占用的储存空间可能比long多, 适用于更大数值的场合。该类型至少占64位。与int类似,long long是有符号 类型。
unsigned int这种类型与有符号类型表 示的范围不同。例如,16位unsigned int允许的取值范围是0~65535,而不 是-32768~32767。用于表示正负号的位现在用于表示另一个二进制位,所 以无符号整型可以表示更大的数。

①使用多种整数类型的原因,是为了适应不同的机器。
②整数溢出,有符号数和无符号数溢出时会从最小的值重新再开始。
如:unsigned int 类型的变量 j 从 0开始;而int类型的变量i则从 −2147483648开始。

打印字符类型解释
charchar类型用于储存字符(如,字母或标点符号)

!从技术层面看, char是整数类型。因为计算机使 用数字编码来处理字符,即用特定的整数表示特定的字符。

!声明:记得加 ‘ ’,对于ASCII值码最好使用字 符常量,而不是数字代码值。

char grade = 65; 
/* 对于ASCII,这样做没问题,但这是一种不好的编程风格,能这样做的前提是系统使用ASCII码 */
非打印字符类型解释
一些代表行为的字符(如,退格、换行、终 端响铃或蜂鸣),通常使用转义序列实现

!转义序列要用:‘ ’
转义序列:
在这里插入图片描述

浮点类型解释
float单精度浮点数在机内存占4个字节,单精度浮点数的表示范围:-3.40E+38~3.40E+38
double双精度在机内存占8个字节,双精度浮点数的表示范围:-1.79E+308~-1.79E+308

!一般来说,CPU处理单精度浮点数的速度比处理双精度浮点数快,如果不声明,默认小数为double类型,所以如果要用float的话,必须进行强转

其他类型解释
bool类型用于表示布尔值,即逻辑值true和false。
复数类型和虚 数类型有三种虚数类型,三种复数类型
可移植类型某些类型名在不同系统中的 功能不一样。C99 新增了两个头文件stdint.h和inttypes.h,以确保C语言的类 型在各系统中的功能相同。

3.4 类型转换

1.类型的级别从高至低依次是:
long double、double、float、unsigned long long、long long、unsigned long、long、unsigned int、int。|

规则:

  • 升级转换:类型转换出现在表达式时,会自动发生从较小类型转换为较大类型的转换。
  • 可能导致类型升级或降级的情况:在赋值表达式语句中,计算的最终结果会被转换成被赋值变量的类型。
  • 要注意,类型降级可能会产生截断从而导致错误。

2.类型强制转换

  • 需要进行精确的类型转换,或者在程序中表明类型转换的意图时。要用到强制类型转换(cast),即在某个量的前面放置用圆括号括起来 的类型名,该类型名即是希望转换成的目标类型。

3.5使用printf()和scanf()函数输入读写不同类型的值

类型:

#include <stdio.h>
 int main(void) 
 {
 	unsigned int un = 3000000000; /* int为32位和short为16位的系统 */
	short end = 200; 
	long big = 65537;
	long long verybig = 12345678908642; 
	printf("un = %u and not %d\n", un, un);  //u表示无符号类型
	printf("end = %hd and %d\n", end, end);  //h表示表示short类型
	printf("big = %ld and not %hd\n", big, big); //l表示long类型输出
	printf("verybig= %lld and not %ld\n", verybig, verybig); //ll表示longlong类型
	return 0;
}

3.6.整数的输出修饰表示

3.7字符串:

  • 是一个或多个字符的序列,双引号不是字符串的一部分。双引号仅告知编译器它括起来的是字符 串,正如单引号用于标识单个字符一样。

  • C语言没有专门用于储存字符串的变量类型,字符串都被储存在char类 型的数组中。

  • 数组由连续的存储单元组成,字符串中的字符被储存在相邻的存储单元中,每个单元储存一个字符。数组末尾位置的字符\0。这是空字符(null character),C 语言用它标记字符串的结束。空字符不是数字0,它是非打印字符,其ASCII码值是(或等价于)0。C中的字符串一定以空字符结束,这意味着数组的 容量必须至少比待存储字符串中的字符数多1。

  • 当使用字符串数组读入时,我们并不用亲自将空字符放入字符串末尾,scanf()在读取输入时就已完成这项工作。且在读取过程中它只会读取字符串中的一个单词,而不是一整句。它在遇到第1个空白(空格、制表符或换行符)时就不再读取输入。

第五章 运算符、表达式和语句

5.1.基本运算符:

C用运算符(operator)表示算术运算。

运算符解释
= 赋值运算符=号左侧是一个变量名,右侧是赋 给该变量的值。符号=被称为赋值运算符。赋值行为从右往左进行。
+ 加法运算符二元运算符,用于加法运算,使其两侧的值相加。相加的值(运算对象)可以是变量,也可以是常量
- 减法运算符二元运算符,用于减法运算,使其左侧的数减去右 侧的数。
符号运算符:- 和+一元运算符,加号、减号还可用于标明或改变一个值的代数符号。如:rocky = –12
乘法运算符:*二元运算符,使两边的值相乘,结果赋值给可改变的左值
除法运算符:/。/左侧的值是被除数,右侧的值是除数。 整数除法和浮点数除法不同。

辨析一:赋值表达式、左值、右值、运算符
解释:
赋值表达式语句的目的是把值储存到内存位置上。用于储存值的数据存 储区域统称为数据对象(data object)。C 标准只有在提到这个概念时才会 用到对象这个术语。使用变量名是标识对象的一种方法。除此之外,还有其 他方法,但是要在后面的章节中才学到。例如,可以指定数组的元素、结构 的成员,或者使用指针表达式(指针中储存的是它所指向对象的地址)。左 值(lvalue)是 C 语言的术语,用于标识特定数据对象的名称或表达式。因 此,对象指的是实际的数据存储,而左值是用于标识或定位存储位置的标签。

辨析二:整数除法和浮点数除法不同。
解释:
浮点数除法的结果是浮点数,而整数除法 的结果是整数。整数是没有小数部分的数。这使得5除以3很让人头痛,因为 实际结果有小数部分。在C语言中,整数除法结果的小数部分被丢弃,这一 过程被称为截断(truncation)。目前C99使用趋l零截断。
注意,整数除法会截断计算结果的小数部分(丢弃整个lingjieduan小数部分),不 会四舍五入结果。混合整数和浮点数计算的结果是浮点数。
实际上,计算机不能真正用浮点数除以整数,编译器会把两个运算对象转换成相同的类型。 本例中,在进行除法运算前,整数会被转换成浮点数。

5.2.运算符结合顺序及优先级

  • 第一组常见运算符
    在这里插入图片描述

  • 第二组常见运算符
    1.sizeof运算符

    • sizeof运算符以字节为单 位返回运算对象的大小,。运算对象可 以是具体的数据对象(如,变量名)或类型。
    • 如果运算对象是类型(如, float),则必须用圆括号将其括起来。

    2.求模运算符:%
    - 求模运算符(modulus operator)用于整数运算。求模运算符给出其左侧 整数除以右侧整数的余数(remainder)。

    • 求模运算符常用于控制程序流。,比如说if语句。

    3.递增(减)运算符:++

    • 将其运算对象递增 1。
    • 紧凑结构的代码让程序更为简洁,可读性更高。
    • ++出现在其作用的变量前面, 这是前缀模式;
      ++出现在其作用的变量后面,这是后缀模式。

优先级: 指针最优,单目运算优于双目运算。如正负号。 先算术运算,后移位运算,最后位运算。 请特别注意:1 << 3 + 2 & 7等价于
(1 << (3 + 2))&7. 逻辑运算最后结合。

  • 优先级与求值顺序无关。如a+b && bc,虽然优先级最高,但这个表达式求值顺序是从左到右。
  • 优先级从上到下依次递减,最上面具有最高的优先级,逗号操作符具有最低的优先级。
  • 相同优先级中,按结合性进行结合。大多数运算符结合性是从左到右,只有三个优先级是从右至左结合的,它们是单目运算符、条件运算符、赋值运算符。

5.3表达式

  • 表达式(expression)由运算符和运算对象组成(前面介绍过,运算对 象是运算符操作的对象)。
  • 每个表达式都有一个值
  • 有赋值运算符(=)的表达式的值与赋值运算符左侧变量的值相同。

5.4语句的副作用和序列点

副作用:

  • 副作用是对数据对象或文件的修改。
  • 大部分情况看来,其副作用大多是其主要目的。

举个例子:
1.从对表达式求值的角度,可认为它的副作用使把把变量states的值改为50。

 states = 50;
//这个语句可以有两种理解
/*
1.对states赋值
2.对表达式求值
*/

2.调用 printf()函数时,它显示的信息其实是副作用(printf()的返 回值是待显示字符的个数)。

序列点:

  • 序列点(sequence point)是程序执行的点,在该点上,所有的副作用都 在进入下一步之前发生。
  • 在 C语言中,语句中的分号标记了一个序列点。
  • 任何一个 完整表达式 的结束也是一个序列点。

什么是完整表达式?
解释:所谓完整表达式(full expression),就是指这个表 达式不是另一个更大表达式的子表达式。

第六章 C控制语句:循环

6.1入口条件 while
1.确定循环:在创建一个重复执行固定次数的循环中涉及了3个行为:

  1. 必须初始化计数器;
  2. 计数器与有限的值作比较;
  3. 每次循环时递增计数器。

2.一些while循环是不确定循环(indefinite loop)。所谓不确定循环,指 在测试表达式为假之前,预先不知道要执行多少次循环。

3.while循环经常依赖测试表达式作比较,这样的表达式被称为关系表达式(relational expression),出现在关系表达式中间的运算符叫做关系运算符(relational operator)。
运算符:<、>、>=、<=、!=、==、+=、*=、-=、/=、%=
在这里插入图片描述
关系运算符常用于构造while语句和其他C语句(稍后讨论)中用到的关 系表达式。这些语句都会检查关系表达式为真还是为假。

注意:比较浮点数时,尽 量只使用<和>。因为浮点数的舍入误差会导致在逻辑上应该相等的两数却 不相等。例如,3乘以1/3的积是1.0。如果用把1/3表示成小数点后面6位数 字,乘积则是.999999,不等于1。使用fabs()函数(声明在math.h头文件中) 可以方便地比较浮点数,该函数返回一个浮点值的绝对值(即,没有代数符号的值)。

关系运算符的优先级

  • 高优先级组: <<= >>=

  • 低优先级组: == !=
    在这里插入图片描述

6.2 真值

  • 要牢记:关系表达式为真,求值 得1;关系表达式为假,求值得0。
  • 例如,用while (goats)替换while (goats !=0)。其中,为表达式goats != 0和goats都只有在goats的值 为0时才为0或假。
  • 第2种形式(while (goats))是C程序员最常用的。

6.3 入口条件 for循环

  • for语句使用3个表达式控制循环过程,分别用分号隔开。initialize表达 式在执行for语句之前只执行一次;然后对test表达式求值,如果表达式为真 (或非零),执行循环一次;接着对update表达式求值,并再次检查test表达式。for语句是一种入口条件循环,即在执行循环之前就决定了是否执行循 环。因此,for循环可能一次都不执行。statement部分可以是一条简单语句或 复合语句。
  • 通过设置不同的表达式,可以让for更加灵活。从而控制变量改变的方向(不只可以增加),增量的形式(几何增长或算术增长)

形式: for ( initialize; test; update )

6.4 逗号运算符与for循环

  • 逗号保证了被它分隔的表达式从左往右求值。
  • 逗号是一个序列点,所以其左侧项的所有副作用都在程序执行逗号右侧项之前发生。
  • 整个逗号表达式的值是右侧项的值。
#include <stdio.h> 
int main(void) 
{
	int i,j,k;
	for(i=0 , j=0 ; i<10, j<4; i++, j++)
		{
			printf("the value of (i<1, j<4) is %d,%d\n", i<1,j<4);
			printf("in this routine ,i equals %d,j equals %d\n",i,j);
			k = i + j;
		}			
	printf("Answer: k is %d\n", k);// 10
	//作为表达式时,它的值等于右值。所以循环了四次。同时保证了左右表达式顺序执行。
	printf("Finally , the value of (i<1, j<4) is %d", (i<1,j<4));
	
	return 0;
}

结果:

6.5 其他运算符

  • 其他运算符:+=、-=、*=、/=、%=,用于更新变量。
  • 用法:左侧是一变量名,右侧是一表达式。赋给变量的新值是根据右侧表达式的值调整后的 值。

6.6 出口条件循环 do while

  • 在循环的每次迭代之后检查测试条件,这保证 了至少执行一次。

6.7 嵌套循环

  • 嵌套循环常用于 按行和列显示数据。
  • 依赖外部循环的嵌套循环,在每次外层循环迭代时内层循环完成不同的任务
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值