C语言教程.docx
- 文档编号:9152864
- 上传时间:2023-02-03
- 格式:DOCX
- 页数:75
- 大小:80.06KB
C语言教程.docx
《C语言教程.docx》由会员分享,可在线阅读,更多相关《C语言教程.docx(75页珍藏版)》请在冰豆网上搜索。
C语言教程
C语言教程
一、C语言基础简略
1、计算机基础简略:
十进制整数转二进制(除二取余排位由低到高),类似45用十除,取余先得低位5后得高位4。
十进制小数转二进制(乘二取整排位由高到低),类似0、45用十乘,取整先得高位4后得低位5。
2、计算机语言的发展过程:
机器语言:
由能被处理器识别的二进制编码指令构成。
不同处理器不同的机器语言,用机器语言编程序工作量大,事实上程序不可能用机器语言编写。
汇编语言:
用助记符代替二进制指令的低级语言。
机器执行程序时先用汇编器(编译程序)将汇编语言翻译成机器语言再执行。
由于助记符和二进制指令的对应关系,所以不同机器有不同的汇编语言和汇编器
高级语言:
不依赖于机器具体指令的语言,由编译器(编译程序)将高级语言编写的程序翻译成机器语言。
高级语言编写的程序虽然可以在不同的机器上执行但不同的机器仍有不同的编译器。
3、编程基础:
一个程序语言有数据结构和算法组成,数据结构即数据的构成也即数据的类型。
算法即操作的步骤。
程序:
为处理问题而编写的指令序列算法:
处理问题的方法和步骤,算法应简要、正确。
4、算法的基本特点:
1、程序的每一步都有确定的意义无二意。
2、每一步都有效。
3、程序步是有限的。
4、有零个或多个输入。
5、有一个或多个输出。
5、算法的表示方法:
1、流程图:
椭圆表示开始/结束、斜长方形表示输入/输出、长方形表示处理操作、菱形表示条件判断
2、N/S图(程序的三种基本结构顺序结构、循环结构、选择结构)自上而下,自外向内的写法。
6、程序的编写步骤:
1、明确程序用途
2、设计算法
3、写程序
4、编译连接
5、运行
6、调试
7、维护修改
7、C语言的特点:
1、语言简捷紧凑使用方便灵活32个关键字,9种控制语句。
2、运算丰富34种运算符。
代码效率高
3、数据结构丰富。
4、c语言是模块化的,减少了重复编程。
5、语法限制不严,程序设计自由度大。
6、兼有高级语言的特点又有汇编语言的特点。
7、生成目标代码质量高,程序执行率高。
8、C语言写的程序可移植性好,不同机器的编译程序80%的代码是公共的
9、功能强大灵活,可编写操作系统和其他语言的编译器
10、C++、C#、JAVA都是从C语言派生出来的
8、C语言的五种基本单词
1)、关键字:
具有特殊含义的标识符
2)、标识符(C语言标识符的定义:
C语言的标识符只能有数字、字母、下划线组成。
且第一个字符必须是字母或下划线。
大小写是有区别的。
标识符可以超过8个但系统只区别前8个字符)
3)、常数分为字符常数、数值常数、字符串常数、枚举常数
4)、操作符由运算符和特定意义标点符组成如花括号、圆括号、方括号等
5)、分割符用来分割相邻的标识符、关键字、常数等
9、C语句:
组成C程序的基本单位,具有独立的程序功能,C语句以分号结尾。
C语句包括:
1)语句体:
分简单语句、复合语句、空语句,2)注释:
书写位置自由可多行不被编译执行的语句行。
10、C函数:
相对独立的程序段或模块
C函数的特点:
1)、必有且仅有一个主函数和任意个子函数组成2)、函数体有本函数局部变量声明和语句序列组成3)、C语句书写自由一句多行或一行多句。
正规的书写是缩进格式书写,不同结构层次语句的起始位置不同
C函数分类:
用户函数和编译系统函数(即库函数)
库函数有输入输出函数、数学函数、等组成
库函数的说明、类型、宏定义保存在相应的标题文件中(头文件)。
对应的子程序存放到运行库中(。
LIB)用户可以直接调用
C语言的注释:
扩在/*-*/之间的内容注释不允许嵌套。
11、C源程序文件:
由多个c函数组成。
12、C源程序:
由多个c源程序文件组成。
13、C语言编程:
文本编辑器:
用C语言编写程序原代码的环境(word文本编辑器)。
hello.c
编译器:
将原代码生成目标代码(机器语言代码)hello.obj。
此时的目标代码不是一个完整的执行程序,还缺启动代码和库函数代码
连接器:
组装目标代码、启动代码、库函数代码生成可执行程序hello.exe
启动代码:
c程序与操作系统的接口
库函数代码:
编译后的目标代码中没有调用的库函数(printfa())的机器代码,printfa()他的机器代码存在库函数的机器代码中
C语言编程的过程:
用文本编辑器编写C语言程序原代码,使用编译器生成目标代码(机器语言代码),使用连接器组装目标代码、启动代码、库函数代码生成可执行程序
二、C语言的数据类型
1、变量和常量
1、任何一类型数据的使用只能以常量和变量两种形式出现在语句中
2、变量概念:
程序运行中其值可以改变的量,他有变量名和变量值组成。
它是内存中一个被命名的数据存储空间
3、变量在用的时候必须先定义后使用(定义数据类型和变量名)
变量名书写规则:
同于标识符规则且C关键字不可用作变量名,多个单词间用下划线连接可以组成一个变量名
4、数值变量的分类:
1、整型变量2、字符型变量(存储字符的ASCII码值的整数)3、浮点型变量。
整型变量和字符型变量有有符号型和无符号型的区别
5、变量的初始化:
在变量定义时就赋予一个确定的值,这个过程叫做变量的初始化
6、变量的定义格式:
数据类型名变量名;
相同数据类型名下可定义多个变量他们之间必须用,号隔开
7、常量:
表示数据值本身,程序运行中其值不可以改变。
8、常量分类:
1、字面常量和2、符号常量(它们又包含整型常量,实型常量、字符型常量、字符串常量)
字面常量:
从字面就能判断其值大小的量。
符号常量:
采用符号常量的优点是可看出常量代表的是什么东西,可使程序中多次出现的常数做到一改全改,可简化较复杂的常数的书写。
符号常量的定义有三种方法:
宏定义、修饰、枚举
宏定义:
在定义语句#difine中用指定的标识符代表一串字符。
代表字符串的符号常量称为宏名,符号常量所代表的字符串只是一串字符无数据类型和值的含义。
宏定义的符号常量的使用注意事项
1)宏定义语句为预处理命令非C语句不可加分号。
2)符号常量用大写,变量用小写加以区别。
3)每个#define只能定义一个宏,且只能占一行,字符串与宏名之间用空格隔开。
4)宏定义中的字符串中可以使用其它宏定义的宏名,称为宏定义的嵌套。
5)编译系统只对程序中出现的宏名,用宏定义中的字符串作简单替换,不做语法检查。
即字符串有错误的书写时,到程序编译后才会报错。
6)宏定义中的字符串可以是复杂的表达式或函数
const修饰符:
在const语句中用标识符代表一常数。
类似变量的初始化赋值,不同的是在程序中不允许对符号常量的值进行赋值修改。
此处的符号常量具有数据类型和值的含义。
定义格式:
const数据类型符号常量=常数
2、C语言的数据类型
1、重点记忆:
1)各数据类型的定义方式
2)各数据类型如何存储
3)各数据类型取值范围
4)各数据类型可执行的运算
5)各数据类型间的混算规则
2、C语言的数据类型分类:
1)基本类型(整型int、字符型char、实型、(单精度型float、双精度型double)枚举类型、无值类型viod)
2)构造类型(数组类型、结构体类型、共用体类型)
3)指针类型
4)空类型
注意各种数据类型的数据占用多大的内存空间是由系统决定的,而不是由规定的。
3、整型
1、整型数值是以补码形式存储的
2、整型变量的分类:
有符号基本整型(signed)int占两字节内存取值范围-32768_0_32767(65536个数)
无符号基本整型unsigned(int)占两字节内存取值范围0_65535(65536个数)
有符号短整型(signed)short(int)占两字节内存取值范围-32768_0_32767
无符号短整型unsignedshort(int)占两字节内存取值范围0_65535
有符号长整型(signed)long(int)占四字节内存取值范围-2147483648_0_2147483647
无符号长整型usignedlong(int)占四字节内存取值范围0-4294967295
不指明为无符号型则系统默认为有符号型,上述类型简写时可将括号内的成分去掉
附加:
每位二进制数可表示2种代码
3位二进制数可表示8种代码000001010011100101110111
其代表的无符号整数为01234567
其代表的有符号整数为0123-4-3-2-1
2、整型数在计算机中是以整型数值的二进制的补码形式存储的。
补码的编码规则是正数的补码是原码,负数的补码是与负数互补数的码值(负数于模相减的码值)。
无符号整数的存储:
因无符号整数是正数,又因正数的补码是原码,所以无符号整数在计算机存储的是无符号整数的二进制码。
有符号整数的存储:
因正整数的补码是原码,所以正整数在计算机中存储的是正整数的二进制码。
因负整数的补码是与负整数互补的数的二进制码值,所以负整数在计算机中存储的是将负整数于模相减的数的二进制码。
3、各种整数类型都有自己的数值范围超出则为溢出,无符号整数溢出时将溢出的值除以模,取剩余的值作为新值。
有符号整数溢出时也是将溢出的值除以模,取剩余的值。
剩余值最高位为0时或剩余值小于等于有符号正数最大值时,则对应的有符号整数为正整数。
其正整数的值为剩余值(补码相同的无符号整数和有符号整数它们的正数部分是相同的,负数部分是互补的)。
剩余值最高位为1时或剩余值大于有符号正数最大值时(溢出),则对应的有符号整数为负整数。
其负整数的值为与剩余值互补的数(补码相同的无符号整数和有符号整数它们的正数部分是相同的,负数部分是互补的)。
举例1)无符号数65535+100000=165535%65535=34465
2)有符号数32767+100000=132767%65535=1697剩余值小于有符号正数最大值,取其原数。
3)有符号数32767+131071=163838%65535=32768剩余值大于有符号正数最大值(溢出),取其互补数。
32768-65536=-32768
4、无符号整数和有符号整数的对应关系
无符号整数和有符号整数在计算机中存储的是它们数值的二进制的补码,所以补码相同的无符号整数和有符号整数它们的正数部分是相同的,负数部分是互补的。
1)有符号数被输出函数的格式控制符转换为无符号数
因有符号数被输出函数的格式控制符转换为无符号数时,将最高位符号位当作数值输出,
又因整型数值是以补码形式存储的,所以有符号数被输出函数的格式控制符转换为无符号数时直接输出与有符号数的补码相对应的无符号数即可。
如intI=35531;printf(%u,I);结果为35531的补码35531;
如intI=-35531;printf(%u,I);结果为-35531的补码-35531+65536=30005;
2)无符号数被输出函数的格式控制符转换为有符号数
因无符号数被输出函数的格式控制符转换为有符号数时,将最高位数值当作符号位输出,又因整型数值是以补码形式存储的,所以无符号数被输出函数的格式控制符转换为有符号数时,直接输出与无符号数的补码相对应的有符号数即可,补码相同的无符号整数和有符号整数它们的正数部分是相同的,负数部分是互补的。
无符号数小于等于有符号正数最大值时(无符号数最高位为0),无符号数的以原数输出.
如unsignedintI=32767;printf(%d,I);结果为3276732767(无符号数最高位为0)无符号数以原数输出.32767
无符号数大于有符号正数最大值时(无符号数最高位为1),无符号数以原数的补数输出.
如unsignedintI=65531;printf(%d,I);结果为6553132767(无符号数最高位为1)无符号数以原数的补数输出.65536-65531=-5
5、有符号数和无符号数变量是可以混算的,计算结果等于混算的结果除以模的剩余值
剩余值小于等于有符号正数最大值时(计算结果最高位为0),计算结果的以原数输出.
有符号数加无符号数30000+1000=31000,除以模的剩余值为31000%65536=31000,剩余值小于等于有符号正数最大值(计算结果最高位为0),计算结果的以原数输出.31000
有符号数加无符号数30000+10000=40000,除以模的剩余值为40000%65536=40000,剩余值大于有符号正数最大值(计算结果最高位为1),计算结果的以剩余值的补数输出.40000-65536=-25536
6、整型常量的表示方法:
1)十进制
2)八进制整型常量规定以前缀数字0开头
3)十六进制整型常量规定以前缀0X大或小写开头。
后缀可加U表无符号、L表长整型、UL组合表无符号长整型
3、实型
实型数据的表示方法:
1、十进制小数表示,整数为零时可直接写小数点和小数部分
2、指数形式〈尾数部分〉E或e〈指数部分〉
书写规则:
1、尾数不可省略2、指数必为整数3、指数尾数可带符号不写默认为正
.E3、.8E5中的只有小数点是正确的书写,标准的书写是尾数的小数点左边仅保留一位非零整数
一般实数在内存的存放:
实数占4个字节,前三个字节为尾数,后一个字节为指数。
指数、尾数第一字节的第一个位为符号位,具体的存放方法由编译系统决定。
实型变量的分类1、单精度型float2、双精度型double3、长双精度longdouble不同的系统对其长度、精度、取值范围有不同的规定
浮点数的四舍五入:
编程时注意计算机会自动保留实数的有效位数
4、字符型数据分字符和字符串
1、字符常量表示方法1)字符加单引号如‘A’
2)单引号内的‘\N’转义字符表示(一定用意的字符)
3)\加对应的ASCII码值的八进制或十六进制数表示。
(八进制为1-3位有效数字,十六进制为X加1-2位有效数字)如‘a’可用‘\141’八进制表示或‘\X61’十六进制表示
2、字符串常量的表示是字符序列用双引号括起来
3、字符和字符串在内存的存储:
字符数据在内存中存的是二进制的ASCII码值整数,一个字符占用一个字节。
字符串的存储和字符一样一个字符占用一个字节,只不过字符串最后要加一个字节用于存放一个空字符作为系统识别字符串结束的标志
4、字符变量的分类:
C仅提供字符类型的变量,无字符串类型的变量(字符串数据在C中无类型标识符)
字符变量的类型符是CHAR在其前可加有符号型和无符号型的修饰符
字符变量存储的是一个字节的二进制ASCII的整数码值,和整数存储方式相同,所以它可进行与整数的混合运算和混合存储,它的有符号型和无符号型取值范围分别是-127到128、0到255,
Charc1=97,c2=98字符变量c1和c2分别存储整数97和98相当于存储ASCII码字符‘a’和‘b’
Intn1=‘a’,n2=‘b’n1和n2是整型变量分别存储字符‘a’和‘b’的ASCII码值97和98
5、访问修饰符:
限制变量自由的修饰符CONSTVOLATILE,它们使用在变量名定义前的任意位置
CONST只能在变量初始化时使用,作用是将一个变量变为一个常量来使用,此常量不可以由程序显示的修改,但外部硬件也可以改变其值
VOLATILE此修饰符提醒编译程序该变量的值可以非程序显示修改。
如硬件端口相连的内存变量的内容会随端口的改变而改变
三、C语言的表达式和运算符
1、表达式是将运算对象用运算符连接起来的式子,分算术表达式、逻辑表达式、关系表达式、赋值表达试等。
2、运算符的优先级和结合性。
1、优先级是指不同级别的运算符出现在表达式中进行计算的优先顺序。
属同一级别的运算符可能有不同类的几个运算符组成(如优先级2由6类运算符组成)。
属同一类的多个运算符可能划分为几个级别(如算术运算符有3个级别)。
2、结合性是相同优先级的运算符出现在表达式中进行计算的先后顺序,先计算运算符右边的为右结合或自右至左的运算方向。
否则为左结合或自左向右的运算方向,运算时先考虑优先级后考虑结合性。
3、运算符有括号运算符、取成员运算符、下标运算符、指针运算符、位运算符、算术运算符、逻辑运算符、关系运算符、条件运算符、赋值运算符、求字节运算符sizeof、逗号运算符12类。
3、算术运算
1、算术运算符优先级和结合性:
算术运算符优先级由高到低排列是一元算术运算符(+、-、++、--)二元算术运算符(*、/、%)二元算术运算符(+、-)。
一元算术运算符优先级高于二元算术运算符,即+、-、++、--属于同一优先级2,它们的结合顺序是右结合的顺序,如-I++是先计算++后计算-。
二元算术运算符*、/、%属优先级3,它们高于二元算术运算符+、-优先级4,二元算术运算符为左结合的顺序。
2、算术运算符作用注解:
%仅用于整数数据的取摸运算如132%100是取不满摸100的数32
/若是两整数相除表示整除结果不保留小数
前置++K表示K值先增1再将新值作为表达试++K的值
后置K++将K值作为表达试K++的值然后再将K值自加1
--与上同样
+,-,*与一般的运算相同
3、算术运算符使用注意事项:
1)自增运算符++和自减运算符——仅作用于单个变量不能用于常量和表达试。
(++--作用是改变自身的值后再自身存储,而内存不会为表达试分配存储空间。
2)++和--可用于任何数值型变量包括字符变量
3)++和--结合方向是右结合或自右向左,如当I=1时-I++和-++I表达试分别等于-1和-2
4)编译系统对运算符的处理原则是向左尽可能多结合一个一个运算符,如I+++J是(I++)+J的运算
5)TurboC规定函数的实际输出参数求值顺序是自右至左的,如inti=1printf(”%d,%d”,i,i++)结果是2、1(显示是自左向右)
4、算术表达式计算结果的数据类型
一元运算结果的数据类型为运算对象的数据类型
二元运算结果的数据类型确定方法为
1)两个运算对象数据类型相同,计算结果的数据类型就是运算对象的数据类型
2)两个运算对象数据类型不相同,先将两个运算对象中长度较短的数据类型转换为长度较长的数据类型,在计算。
计算结果的数据类型为数据较长的数据类型。
两个运算对象数据类型转换规则:
longdouble←double←float←longint←unsignedint←int←shorint←char
a、shortchar类型无条件转换为int类型
b、float类型无条件转换为double类型,两个数据都为float型,也全部转换为double类
c、将数据长度短的数据直接转换为的数据长度长的数据时(数据长度:
数据占用内存字节数)注意:
相同级别的数据类型,unsigned要比signed级别高,故将signed数据转换为unsigned数据。
d、将表达试计算结果的数据类型无条件转换为左边赋值变量的数据类型。
即使计算结果的数据类型比定义变量数据类型精度高,也要转换。
4、逻辑运算和关系运算
1、关系与逻辑运算符优先级从高到低的排列为:
!
逻辑非(优先级2),一元运算符,左结合。
>、>=、<、<=小于等于(优先级6),二元运算符,左结合。
==、!
=不等于(优先级7),二元运算符,左结合。
&&逻辑与(优先级11),二元运算符,左结合。
||逻辑或(优先级12),二元运算符,左结合。
2、逻辑运算和关系运算结果是逻辑值1和0,C语言没有逻辑数据的数据类型。
计算表达试时判断的标准是非0数是真,为0是假。
3、逻辑运算和关系运算求值方法用的是懒惰求值法。
懒惰求值法:
只运算表达式内能决定输出值的几个运算,其他运算不在执行。
表达试的计算是从左到右顺序按运算符的优先级进行的。
举例1、如a=b=c=1++a||++b&&++c计算结果是1,abc的值分别为2、1、1因为++a优先级最高计算为2真值,以后的计算不在进行所以b和c结果为1。
举例2、a=b=c=-1++a&&++b||++c++b不计算,abc分别值为0、-1、0表达试结果为0。
举例3、a=b=c=-1++a||++b&&++c++c不计算abc分别为0、0、-1表达试结果为0
5、条件运算符
条件运算符?
是C语言中的唯一个三元运算符,它将表达试分为三部分。
格式为 exp1?
exp2:
exp3
首先计算表达试exp1的值如非0再计算表达试exp2的值作为整个表达试的值,exp1的值如为0则计算表达试exp3的值作为整个表达试的值。
条件运算符优先级为13,结合性为右结合或自右向左的结合性。
举例:
inta=2,b=3,c=3;a>b?
c>a++:
b-->a?
c++:
c--;表达试的值为3,a、b、c的值为2(c>a++未执行)、2、4。
6、赋值运算符
赋值运算符=是一个二元运算符作用是将右边表达试的值赋给左边的变量。
赋值运算符优先级为14 。
赋值运算符的结合性也是自右向左的,如I=J=K=3是自右向左的赋值。
复合的赋值运算符:
只有算术运算符或位运算符能与赋值运算符组合得到复合的赋值运算符
+=、-=、*=、/=、%=、>>=、<<=、&=、^=、|=
复合的赋值表达试:
(变量)(复合的赋值运算符)(表达试)
实际等价于(变量)=(变量)(算术运算符或位运算符)(表达试)
如A+=3等价于A=A+3
求存储长度的运算符sizeof:
sizeof是一种一元运算符,优先级为2,结合性为右结合。
用于计算被运算对象要占几个字节的存储空间。
计算结果为无符号型整数usigned。
Sizeof运算符使用格式:
sizeof (测试对象)
测试对象可以是变量、表达式、数据类型关键字
举例Sizeof(char)结果为1、Sizeof(++i)的I值不会改变sizeof(113L)结果为2
sizeof
(1)结果为2sizeof(‘1’)结果为2按字符对应的ASCII码整数值来存储
sizeof(“1”)字符占一个字节空间,字符串结束标志符‘\O’占一个字节
Sizeof运算符使用注意事项:
sizeof(表达试)是计算表达试值的数据类型所占的字节数,而表达试不执行运算。
7、逗号运算符
逗号运算符作用
1、作为分隔符将数据想分割开,主要用于分割变量说明和形式参数表。
2、作为运算符称为顺须运算符,作用是将多个表达试连接起来构成一个逗号表达式。
逗号运算符的优先级别最低为15,其结合顺序是左结合,如1+2,3+4,5+6为一个逗号表达试,子表达式的计算顺序是从左到右,最后的一个子表达试的值作为整个逗号表达试的值。
逗号表达式的特殊使用
在某些语句的语法位置只允许出现一个表达式,用逗号表达式可以实现这些语法位置有多个表达式共存。
如:
for(I=0,j=0;i<8,j<9;I++,j++;)
循环变量赋初值、循环终止条件判断、循环变量增值这三个语法位置只允许用一个表达式,用逗号表达式可实现两个表达式的计算。
8、位操作运算符
位操作运算符只能对整型数进行运算,包括short、long、signed、unsigned修饰符修饰的整型数。
不能运算Floatdoubleviodlongdouble型及更复杂的数据类型。
位操作运算符经常用于设备驱动程序中如1、调制解调器程序中用于屏蔽某些位,实现奇偶校验。
2、用密码子程序将文件的字符涿位取反,实现文件的不可读。
左移位实现乘运算,右移位实现除运算。
位操作运算符有以下6种,按优先级由高
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 教程