版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第1章C语言基础1.1C语言概述1.2基本语法成份1.3C程序的结构1.4C程序的实现1.1C语言概述1.1.1C语言的产生与发展1.C语言的产生
C语言于1972年~1973年间,诞生于美国的贝尔实验室,由Denis.M.Ritchie创建。
C语言的产生基于两个方面的需要。一是为满足UNIX操作系统开发的需要。UNIX操作系统是一个通用的、复杂的计算机管理系统。二是为拉近高级语言与硬件之间距离的需要。
C语言集高级语言与汇编语言优点于一身。
C语言面对实际应用的需要而产生,直至今日仍不改初衷。2.C语言的发展1960年出现的ALGOL语言是一种面向问题的高级语言,远离硬件,不适于开发系统软件。1963年,英国剑桥大学推出CPL语言,CPL语言比ALGOL语言接近硬件一些,但规模较大,难以实现。1969年,剑桥大学的M.Richards对CPL语言进行简化,推出BCPL语言(BCPL—BasicCombinedProgrammingLanguage)。1970年,贝尔实验室的K.Thompson为DEC公司PDP[CD*2]7计算机上运行的一种早期UNIX操作系统设计了一种类BCPL语言,称为B语言。B语言规模小,接近硬件,1971年在PDP-11计算机上实现,并写了UNIX操作系统。1960年~1971年是C语言的萌芽阶段。1972年~1973年间,贝尔实验室的D.M.Ritchie在保留B语言优点的基础上,创建了C语言。1973年,UNIX操作系统被用C语言改写,称为UNIX第五版。最初的C语言只是一种UNIX操作系统的工作语言,依附于UNIX系统,主要在贝尔实验室内部使用。
UNIX以后的第六版、第七版、SYSTEMⅢ和SYSTEMⅤ都是在第五版的基础上发展起来的,C语言也作了多次改进。到1975年,UNIX第六版的公布,使C语言受到人们的普遍注意。UNIX操作系统的广泛使用,促进了C语言的迅速发展与普及,C语言的发展与普及也促进了UNIX操作系统的推广。到1978年出现了独立于UNIX和PDP计算机的C语言,从而,C语言被迅速移植到大、中、小与微型机上。当年,B.W.Kernighan和D.M.Ritchie以UNIX第七版的C编译程序为基础,出版了影响深远的名著《C程序设计语言》。
C++语言是C语言发展的新阶段,是一种更好的C语言,是应用广泛的面向对象的程序设计语言。
3.C语言的标准与方言
各机构推出了自己的C语言与版本,某些执行过程的微小差别不时引起C程序之间的不兼容。美国国家标准协会(ANSI)从1983年开始,经过长达五年的努力,制定了C语言的新标准——ANSIC,现在提及C语言的标准就是指该新标准。ANSIC比原标准C有很大的发展,解决了经典定义中的二义性,给出了C语言的新特点。K&R也以新标准改写了他们的经典著作。任何C程序都必须遵循ANSIC标准,本教材的主体也以ANSIC作为基础。1.1.2C语言的特点
(1)C语言简洁、紧凑,压缩了一切不必要的成份。
(2)C语言运算丰富,将括号、赋值、强制类型转换、取变量地址等都以运算实现。
(3)C语言数据类型丰富,具有现代语言的各种数据类型;用户能扩充数据类型,能够实现各种复杂的数据结构,完成各种问题的数据描述。
(4)C语言是一种结构化程序设计语言,具有结构化语言所要求的三种基本结构。(5)C语言允许直接访问物理地址,能进行位运算,能实现汇编语言的大部分功能,能直接对硬件进行操作。C语言是高级语言中的低级语言。
(6)C语言提供预处理机制,有利于大程序的编写和调试。
(7)C语言编译系统小,生成目标代码质量高,程序执行效率高。
(8)C语言输入/输出功能用库函数实现,编写的程序移植性好。
(9)C语言语法限制不太严格,程序设计自由度大,对程序员要求不高。1.2基本语法成份1.2.1字符集
字符是可以区分的最小符号,构成程序的原始基础。C语言字符集是ASCII字符集的一个子集,包括英文字母、数字及特殊字符:
·
英文字母:a~z和A~Z
·
数字:0~9
·
特殊字符:空格!#%^&*--+=~<>/\|.,:;?′″()[]{}
由字符集中的字符可以构成C语言进一步的语法成份,如标识符、关键字、特殊的运算符等。1.2.2标识符
标识符在程序中用来标识各种程序成份,命名程序中的一些实体,如变量、常量、函数、类型、标号等对象的名字。
C语言规定,标识符必须以英文字母或下划线开头,是字母、数字、下划线的序列。以下是合法的标识符:x,c,a1,a2,op,y-1,zhou-prg,radius,prime,program,prg-1,cout,sun,day
以下是不合法的标识符:a.1,1computer,x+y,!abc,99999,$100,π,3cC语言中标识符要区分大小写,标识符abc与标识符ABC是不同的标识符。习惯上符号常量用大写字母表示,变量名称用小写字母表示。标准C中,标识符的长度可以是任意的,一般有效长度为8个字符,TURBOC中标识符最大长度为32个字符。标识符取名时不能与关键字同名,也不能与系统预先定义的标准标识符(如标准函数)同名,最好能“见名知义”,以提高程序的可读性。一般选用相应英文单词或拼音的缩写形式,尽量不要使用简单代数符号,如a,b,c,x,y,z等。标识符大多数采用“匈牙利”表示法,每个单词第一个字母大写,如StudentName、YearMonthDate。1.2.3关键字
关键字又称为保留字,由系统提供,用以表示特定的语法成份,如类型名称int、float,语句特征if、switch、while,运算符号sizeof等,是构成C语言的语法基础。常见关键字有31个,参见附录A。关键字有特定的语法含义,不允许用户重新定义。关键字在程序中像国家的名字一样,绝对不能拼错。1.2.4运算符运算符实际上可以认为是系统定义的函数名字,这些函数作用于运算对象,得到一个结果值。运算符通常由1个或多个字符构成。根据运算对象的个数不同,运算符可分为单目运算符、双目运算符和三目运算符,又称为一元运算符、二元运算符和三元运算符。1.3C程序的结构例1-1
在屏幕上输出“C语言程序设计”。/*程序1[CD*2]1,输出″thisisaCprogram.″*/#include″stdio.h″main(){printf(″thisisaCprogram.\n″);}运行结果:thisisaCprogram.例1–2
求两个整数之和。
/*程序1-2,求两个整数之和*/
#include″stdio.h″main(){inta,b;intsum;scanf(″%d,%d″,&a,&b);sum=a+b;printf(″sum=%d\n″,sum);}输入数据:1999,1运行结果:和=2000例1-3
求两个数的最大值。
/*程序1-3,求两个数的最大值*/
#include″stdio.h″intmax(intx,inty)/*求最大值函数{intt;if(x>y)t=x;elset=y;return(t);}main()/*主函数*/{inta,b;intc;scanf(″%f,%f″,&a,&b);c=max(a,b);/*调用求最大值的函数*/printf(″max=%d\n″,c);}输入数据:12,3运行结果:max=121.3.1C程序的结构1.函数
(1)C程序由若干函数组成,其核心成份是函数。①必须有一个且只能有一个主函数main(),主函数的名字为main。②可以是系统预定义的标准函数,如scanf函数、printf函数等,参见附录C。大多数函数由程序员根据实际问题的需要进行定义,函数之间是平行的关系。基于此,C语言被称为函数式语言。(2)函数由函数头(函数的说明部分)与函数体(函数的语句部分)两部分组成。①函数头给出函数的特征描述,包括函数的属性、类型、名字、参数及参数类型。如例1[CD*2]3中的求最大值函数的函数头:intmax(intx,inty)/*函数属性缺省,函数类型整型,函数名字max,函数参数x,y,整型*/等同于intmax(x,y)intx,y;②函数体给出函数功能实现的数据描述和操作描述,是程序中用花括号括起的若干语句。如例1-1中的函数体:{printf(″thisisaCprogram.″);}
函数体可以为空,可以没有数据描述部分。2.语句
(1)语句是组成程序的基本单位,函数功能的实现由若干条语句完成。说明性语句完成数据描述,执行性语句完成操作描述。
(2)语句由若干关键字加以标识,如if-else语句、do-while语句等。C语言语句必须以分号结束。
(3)C语言本身没有输入/输出语句,C语言的输入/输出操作由scanf函数和printf函数等库函数完成。3.其它
1)预处理命令
C程序开始往往含有以“#”开头的命令,它们是预处理命令。如例1-1中#include″stdio.h″,用以指明包含文件。请参阅第12章。
2)程序注释在程序中还有以“/*”开始,以“*/”结束的内容,它们是程序中的注释部分,用以帮助阅读程序。注释对程序的执行没有任何影响,编译时将被过滤掉。加必要的注释只为增加程序的可读性。1.3.2C程序的书写(1)一行一般写一条语句。当然一行可以写多条语句,一条语句也可以写在多行上。
(2)整个程序采用紧缩格式书写。表示同一层次的语句行对齐,缩进同样多的字符位置。如循环体中的语句要缩进对齐,选择体中的语句要缩进对齐。
(3)花括号的书写方法较多,本书采用花括号对齐的书写方式,左边花括号处于第一条语句的开始位置,右边花括号独占一行,与左边花括号对齐。
(4)在程序中恰当地使用空行,分隔程序中的语句块,增加程序的可读性。1.4C程序的实现1.4.1实现步骤C程序在计算机上的实现与其它高级语言程序的实现一样,一般要经过编辑、编译、连接、运行四个步骤,如图1-1所示。图1-11.编辑
编辑是将C语言的源程序输入计算机,并以文本文件的形式存储在磁盘。编辑是建立C源程序文件的过程,源程序文件的扩展名为.C或.CPP。编辑可以用任何文字处理软件完成,一般用编译器本身集成的编辑器进行编辑。2.编译
C语言是以编译方式实现的高级语言,C程序的实现必须经过编译程序对源程序进行编译,生成目标代码程序。目标代码程序的扩展名为.OBJ。编译前先进行预处理。编译过程主要进行词法分析和语法分析。编译有错时,在屏幕上列出错误的位置和种类。此时,要返回到编辑步骤修改源程序,修改后,再进行编译。3.连接
编译形成的目标代码程序机器可以识别,但还不能直接执行,还需要将目标代码程序与库文件进行连接处理,连接工作由连接程序完成。经过连接,生成可执行文件。可执行文件的扩展名为.EXE。连接有错同样需返回到编辑步骤修改源程序,修改后,再进行编译、连接。4.运行
一个C源程序经过编译、连接后生成了可执行文件。运行可执行文件,可通过编译系统下的运行功能,也可像执行DOS的外部命令一样,输入执行文件名运行。程序运行后,一般在屏幕上显示运行结果。根据运行结果可以判断程序是否还有算法方面的错误。编译时产生的错误是语法错误,运行时出现的错误是逻辑错误。出现逻辑错误时需要修改算法,重新编辑、编译、运行程序。1.4.2程序的执行C程序的执行总是从主函数main()开始,不管主函数在程序中什么位置。主函数中的语句依先后顺序执行,除非改变了程序的执行流程。其它函数通过被调用执行。1.4.3TURBOC上机操作1.启动TURBOC
只需执行TC.EXE文件,即可启动TURBOC进入TURBOC的操作界面。如使用中文,需先将计算机置于中文操作系统管理之下。用TC加源程序文件名可快速启动TURBOC,立即进入编辑操作。2.TURBOC操作界面启动TURBOC后,主操作界面如图1-2所示。图1-21)组成
TURBOC主操作界面由主菜单区、编辑窗口、信息窗口、热键区四部分组成。
TURBOC的操作采用菜单驱动,主菜单包括File(文件操作)、Edit(编辑操作)、Run(运行操作)、Compile(编译操作)、Project(工程文件)、Options(编译选择)及Debug(跟踪排错)各项。热键区提供常用操作的快速功能键方式,如F1(帮助)、F2(保存文件)、F3(装入文件)、F5(缩放窗口)、F6(切换窗口)、ALT+F5(用户屏幕)、ALT+X(退出TURBOC)等。2)主窗口当前操作窗口为主窗口(工作窗口),主窗口为双线框表示,按F6可切换主窗口,按F5可缩放主窗口。
3)菜单选择方式一:按F10进入主菜单区,通过菜单项的大写字母选择相应菜单项,或通过光标控制键(→、←、↑、↓)移动高亮度光棒至相应菜单项,按回车选择相应菜单项。方式二:用热键ALT加相应菜单项的大写字母,选择相应菜单项。对子菜单项的选择,操作方法类似。3.编辑
编辑在编辑窗口中进行,有多种方式进入编辑环境:
方式一:选择Edit项。方式二:选择File项的子项New,用于编辑新程序。方式三:选择File项的子项Load,装入要修改的程序,用于修改程序。方式四:启动时采用快速启动方式。
TURBOC的编辑操作是Wordstar、WPS等字处理软件编辑操作的子集,它与Wordstar、WPS的编辑操作完全类似。
4.编译
TURBOC将编译、连接一道完成。按热键F9或选择Compile项进入编译。编译时发生错误,返回编辑步骤,修改程序后,再编译程序。
5.运行按热键CTRL+F9或选择Run项下的子项Run,运行计算机中的程序。按ALT+F5键或选择Run项下的子项UserScreen进入用户屏幕,查看程序运行结果。运行时发生错误,返回编辑步骤,修改程序后,再编译、运行程序。对于没编译的程序,选择运行会先自动进行编译操作,再运行程序。
算法举例
例1求5!(1×2×3×4×5)
s1,1→ps2,2→Is3,P×i→ps4,I+1→Is5,输出p完整的算法s1,1→p
s2,2→I
s3,当I<=5为真时到s4;为假时到s7
s4,P×i→ps5,I+1→I
s6,转到s3
s7,输出p
开始1→p2→II<=5ftP×i→pI+1→I
输出p
结束循环1→p2→II<=5P×i→pI+1→I输出p流程图表示N-S图表示计算机语言表示Main(){intp,I;p=1;I=2;while(I<=5){p=p*I;I++;}printf(“%d”,p);}例250个学生,打印成绩大于等于80的学生的学号和成绩。s1,I=1s2,I<=50为真时到s3;为假时到s6s3,gi>=80为真时打印ni和gi;为假时空操作s4,I=I+1s5,转到s2s6,结束开始1→iI<=50打印ni和giI+1→IGi>=80结束1→iI+1→ItGi>=80f打印ni和giI+1→I流程图表示N-S图表示fttf伪代码表示BEGIN(算法开始)I=1;WhileI<=50{inputn1andgiI=I+1;}I=1;whileI<=50{ifgi>=80printniandgiI=I+1}END(算法结束)三种基本结构的n-s图表示
ABTPFAB顺序结构选择结构当P1成立
AB
直到P1成立当型循环结构直到型循环构例4求1-1/2+1/3-1/4+…+1/99-1/00算法可表示如下:S1,sign=1S2,sum=1S3,deno==2S4,sign=(-1)*signS5,term=sign*(1/deno)S6,sum=sum+termS7,deno=deno+1S8,若deno<=100返回s4,否则算法结束开始Sum=1Deno=2sign-=1sign=(-1)*signterm=sign*(1/deno)sum=sum+termdeno=deno+1NDeno>100Y结束sum=1Deno=2Sign=1Sign=(-1)*signTerm=sign*1/denosum=sum+termDeno=deno+1直到deno>100
打印sumN-S图表示流程图表示计算机语言表示Main(){intsign=1;floatdeno=2.0;,sum=1.0,term;while(deno<=100){sign=-sign;term=sign/deno;sum=sum+term;deno=deno+1;}Printf(“%f”,sum);}习题:有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13…求出这个数列的前20项之和.例5:对于一个大于或等于3的正整数,判断它是不是一个素数S1:输入n的值s2:I=2(I作为除数)S3:N被I除,得余数rS4:如果r=0,表示n能被I整除,则打印n”不是素数“,算法结束;否则转到s5S5:I=I+1S6:如果I<=n-1,返回s3;否则打印n”是素数“,然后结束.输入nW=0I=2R=n/I的余数是r=0否W=1I=I+1直到了I>或w<>0是w=0否输出n是素数输出n不是素数N-S图表示计算机语言表示#include<math.h>Main(){intn,I,k;scanf(“%d”,&n);k=sqrt(n);for(I=2;I<=k;I++)if(n%I==0)break;if(I>k)printf(“%disaprimenumber”,n);elseprintf(“%disnotaprimenumber”,n);}结构化程序设计方法
例6:用筛法(埃拉托色尼筛法)求1-200之间的所有素数
1234567891011121314151617181920………….200A:B:C:
输入1~n
把所有非素数去掉
打印全部素数输入n的值I=1当I<=nxi=II=I+1A:将x1去掉(使x1=0)I=2当I<n的平方根的整数如xi未去掉,则xi+1xn间全部是xi倍数的数去掉
I=I+1B:I=1
当I<=n
打印未挖掉的xiI=I+1C:算法的进一步细化B1B2B3D3.1数据类型-数据类型基本类型整型字符型实型(浮点型)单精度型双精度型枚举型构造类型数组类型结构体类型共用体类型指针类型空类型3.1.1常量的定义方法
常量是在程序运算过程中不变的量。常量在程序中经常直接出现,如123、3.14159、′a′、″computer″,此时只要求它们符合相应类型数据的表示方法。相应于各种数据类型,有整型常量、浮点型常量、字符型常量及字符串常量。
常量定义是指定义符号常量,用一个标识符来代表一个常量,通过宏定义预处理指令来实现。格式:#define标识符常量由用户命名的标识符是符号常量名。作为符号常量名,一般大写。一旦定义,在程序中凡是出现常量的地方均可用符号常量名来代替。对使用了符号常量的程序在编译前会以实际常量替代符号常量。例2–5
求圆的面积。/*程序2-5,求圆的面积*/#definePI3.14#defineR2#include″stdio.h″main(){floats;s=PI*R*R;printf(″面积=%6.3f″,s);}运行结果:面积=12.5603.1.2变量定义1.变量定义方法
i格式:类型名变量表;变量的值变量表是用逗号分开的变量名。例如:存储单元①inti,j;/*定义i,j为整型变量*/②floatx,y;/*定义x,y为实型变量*/③charch;/*定义ch为字符型变量*/35
2.变量的初始化
定义了变量,变量并没有值。可以在定义变量的同时给出初值,对变量进行初始化。例如:①inti=9;/*定义整型变量i,初值为9*/②floatr=1.5;/*定义实型变量r,初值为1.5*/③charanswer=′y′;/*定义字符型变量answer,初值为字符y*/3.2整型3.2.1基本整型1.类型名称
int
2.取值范围
-32768~+32767(-215~215-1)
3.数据表示方法与数学上类似,不能有分隔符。C语言允许使用八进制整数与十六进制整数,八进制整数加前导0(数字),十六进制整数加前导0X。
4.运算操作
(1)算术运算包括:+(加法)、-(减法)、*(乘法)、/(除法)、%(求余),运算规则除除法外,与数学中相同。整数的除法运算是整除,得到商,如5/3结果为1。对于负数,多数机器采用向零取整法,如-5/3结果为-1。求余运算,又称取模运算,得到余数,如5%3结果为2,-5%3结果为-2。求余运算在许多场合都非常有用,如判断整数a是不是b的倍数,可看a%b是否等于零。a%10得到a的个位数字,a/10)%10得到a的十位数字,如此可分离一个整数的数字。一般只有除数大于0,求余运算才有意义。当a小于0时,a%b等于-((-a)%b)。(2)关系运算包括:<(小于)、<=(小于等于)、==(等于)、!=(不等于)、>(大于)、>=(大于等于)等六种,运算规则与数学中相同,运算结果为逻辑类型数据。关系运算成立结果为1,不成立结果为0。5.存储
C标准没有具体规定各类数据存储的字节数,各种机器处理有所不同,一般以一个机器字(Word)存放1个int数据,PC机上int数据存储用两个字节。机器中用最高位表示数的符号,正数符号位用0表示,负数符号位用1表示。负数在机器中存放的是其补码。6.应用例2-1
求两个整数的积。/*程序2-1,求两个整数之积*/#include″stdio.h″main(){inta,b;intm;printf(″请输入两个整数a,b:″);scanf(″%d,%d”,&a,&b);m=a*b;printf(″积=%d\n″,m);}输入数据:2000,1运行结果:积=20003.2.2拓展整型为拓展数据处理的范围,C语言通过类型修饰符来改变基本数据类型的含义,使之精确适合于不同应用场合。拓展后的整型有短整型、长整型及无符号整型。
1.类型修饰符
short:缩短数值所占字节数。
long:扩大数值所占字节数。
signed:有符号位,缺省方式。
unsigned:无符号位。2.短整型短整型类型名称为shortint或short,在TURBOC中,短整型与基本整型相同。
3.长整型长整型类型名称为longint或long,取值范围为-231~231-1(-2147483648~2147483647),长整型数据可加后缀L表示,在TURBOC中,存储占4个字节,运算与基本整型相同。
4.无符号整型
无符号数与有符号数的主要区别是数的最高位不作符号处理,表示数的绝对范围是有符号数的两倍。相应的无符号整型有无符号基本整型、无符号短整型和无符号长整型。无符号基本整型,类型名称为unsignedint或unsigned,取值范围为0~65535(0~216-1),存储占两个字节。无符号短整型,类型名称为unsignedshortint或unsigned,取值、运算、存储同无符号基本整型。无符号长整型,类型名称为unsignedlongint或unsignedlong,取值范围为0~4294967295(0~232-1),存储占4个字节。无符号整型常用于处理大整数及地址数据。例2–2
整数9的机器表示。作为int,0000000000001001作为shortint,0000000000001001作为longint,00000000000000000000000000001001以上第一位为符号位,表示正整数。以下第一位为正常的数据位,非符号位。作为unsignedint,0000000000001001作为unsignedshortint,0000000000001001作为unsignedlongint,000000000000000000000000000010013.3浮点型3.3.1单精度型1.类型名称float2.取值范围
绝对值范围为10-38~1038,7位有效数字。3.数据表示方法
实数有一般形式和指数形式两种表示方法。一般形式又称小数表示法,是一种常规形式,由整数部分、小数点、小数部分三部分组成。C语言中的实数可以没有小数部分或没有整数部分,如20.,.375。指数形式由尾数、指数符号e或E、指数三部分组成,尾数是一般形式的实数。指数形式适于表示较大或较小的实数。如2.34e10、2.34e-10,相应于数学中2.34×1010、2.34×10-10
。4.运算操作
实型数据的运算操作有算术运算和关系运算两大类,运算符同整型,运算规则与数学中实数的运算规则相同,但运算结果可能是一个近似值。实数没有求余运算。
5.存储
4个字节6.应用例2–3
求两个实数的积。/*程序2-3,求两个实数之积*/#include″stdio.h″main(){floata,b;floatm;printf(″请输入两个整数a,b:″);scanf(″%f,%f″,&a,&b);m=a*b;printf(″积=%6.3f\n″,m);
输入数据:1.1,2.21运行结果:积=2.4313.3.2双精度型双精度型类型名称为double或longfloat,取值的绝对值范围为10-308~10308,16位有效数字,数的表示与运算操作同单精度型,8个字节存储,能提高计算精度。计算机中太大的数不能表示,太小的数也不能表示,超出数的表示范围称为溢出,相应的有上溢与下溢。对于太大数的处理必须通过间接的方法进行。3.4字符型3.4.1字符类型
1.类型名称
char
2.取值范围
ASCII码字符集中的字符。3.数据表示方法
字符数据用单引号作界定符,如′a′、′+′、′%′、′:′、′1′、′2′。注意:单引号字符本身及双引号、反斜杠字符由于有特定的含义,不能如此表示,数字字符与数字不同。字符数据本身除了可以直接出现,还可以通过反斜杠后跟ASCII码描述。ASCII码可采用3位八进制数或2位十六进制数,相应描述形式是\ddd与\xhh(位数不够,加0补位),这种表示方法称为转义表示或转码表示。尤其是一些特殊的字符只能这样表示,如图形字符′■′的表示′\376′,单引号、双引号、反斜杠可表示成′\047′、′\042′、′\134′。
如此字符A可表示为′A′、′\101′、′\x41′。对一些常用的特殊字符,C语言还提供特定的字符来转义表示:′\n′:回车换行′\\′:反斜杠字符
′\′′:单引号字符′\′′:双引号字符
′\a′:响铃报警′\b′:退格
′\f′:走纸换行′\r′:回车
′\t′:横向跳格′\u′:竖向跳格
4.运算操作
C语言的字符数据实际存储其ASCII码,存储形式与整数的存储形式类似。C语言中规定字符数据与整型数据在ASCII码取值范围内通用,因而C语言中字符数据可进行整型数据的运算及操作。例如:①′a′+′b′,等于97+98;②′a′+2,等于97+2;③′a′<′b′等于97<98。5.存储
1个字节。6.应用例2-4
输出ASCII码表。/*程序2-4,输出ASCII码表*/#include″stdio.h″main(){inti;printf(″ASCII码表\n″);for(i=0;i<=255;i++)printf(″字符%c,ASCII码%d\n″,i,i);}3.4.2字符串数据1.字串表示
字串数据用双引号作界定符,如:″chinaone″、″computer″、″$123.45″、″\nabc″、″%d%f″2.字串存储字串数据存储除存储构成字符串的字符序列本身外,还必须附加存储字串的结束标志空操作字符′\0′存储一个字串的字节数等于字符个数加1,即字串长度再加1。
3.字串类型
3.5逻辑类型3.5.1逻辑类型
C语言没有专门提供逻辑类型,而是借用整型、字符型、实型来描述逻辑数据。
C语言规定,0作为逻辑数据代表假,非0的数作为逻辑数据代表真。在一个式子里面要注意区分作为普通数据的数与作为逻辑数据的数。
C语言同时规定,逻辑数据真为1,逻辑数据假为0。如:2<3为真,表达式的值为1;2>3为假,表达式的值为0。3.5.2逻辑运算
假定有逻辑数据p、q,逻辑运算的运算规则为:①!p,得到与p相反的逻辑数据。p为真,!p为假;p为假,!p为真;②p&&q,只有p、q同时为真时,运算结果为真;只要p、q有一个为假,运算结果为假;③p||q,只要p、q中有一个为真,运行结果为真;只有p、q同时为假,运算结果为假。例如:①!(2>3)等于1;②(2>3)&&(3>2)等于0;③(2>3)||(3>2)等于1。3.6标准函数
函数调用通过函数名进行,以实际数据(实参)代替函数中的参数,即函数名(实参)。数学函数包含在头文件math.h中,用#include″math.h″指明。参数x为double,或float,或int型数,函数值为double型。常用的标准数学函数有:①acos(x),求x的反余弦,x必须在-1~1的范围内。②asin(x),求x的反正弦,x必须在-1~1的范围内。3.1表达式基础3.1.1表达式的组成1.运算符
运算符又称操作符,是一个符号,它指示在一个或多个操作数上完成某种运算操作或动作。
C语言中,除了输入、输出及程序流程控制操作以外的所有基本操作都作为运算处理。如,赋值运算符“=”、逗号运算符“,”、括号运算符“()”。①算术运算符有+、—、*、/、%、++、--②关系运算符有<、<=、==、!=、>、>=③逻辑运算符有!、&&、||④位运算符有<<、>>、~、|、^、&⑤赋值运算符有=、+=、-=、*=、/=、%=⑥条件运算符有?:⑦逗号运算符有,⑧指针运算符有*、&⑨求字节数运算符有sizeof10强制类型转换运算符有(类型)11其它运算符有.、→、()、[]等2.操作数
操作数是运算符的操作对象,可以是常量、变量、函数与表达式。常量、变量、函数本身就是简单表达式,从一般意义上讲,C语言中所有操作数都是表达式。复杂表达式由运算符连接简单表达式形成。3.1.2表达式的书写
C语言的表达式虽然来源于数学表达式,是数学表达式在计算机中的表示,但在书写时应该注意遵循C语言表达式书写的原则:(1)C语言的表达式只能采用线性的形式书写。例如:①应写成1/3+i+j*j*j。②应写成(a+b)/(c+d)*e+f。(2)C语言的表达式只能使用C语言中合法的运算符和操作数,对有些操作必须调用库函数完成,而且运算符不能省略。例如:①πr2应写成3.14159*r*r。②应写成0.5*a*b*sin(alph)。③|x-y|应写成fabs(x-y)。④y+2X
应写成y+pow(2,x)。3.1.3表达式的分类
C语言表达式种类很多,有多种分类方法。我们一般依据运算的特征将表达式分为:①算术表达式,如a+b*2.0-3.0/5.0。②关系表达式,如x>=y,关系表达式可以认为是逻辑表达式的特殊情况。③逻辑表达式,如(x>=2)&&(x<=8)。④赋值表达式,如a=b=c=1。⑤条件表达式,如(a>b)?a:b。⑥逗号表达式,如a=2,b=a*a,c=sqrt(b)。3.1.4表达式的计算1.运算符优先级C语言将运算符的优先级划分为15级,初等运算()、[]、→、.优先级最高,单目运算!、~、++、--、-、(类型)、*、&、sizeof优先级次高,算术运算+、-、*、/、%再次之,然后是关系运算<、<=、==、!=、>、>=,再然后是逻辑运算&&、||,条件运算式?:,赋值运算=、+=、-=、*=、/=、%=,逗号运算优先级最低,位运算优先级比较分散。2.运算符的结合性
运算符的结合性是指,优先级相同的运算从左到右进行(左结合性)还是从右至左进行(右结合性),左结合性是人们习惯的计算顺序。
C语言中,只有单目运算(!、~、++、--、-、*、&)、条件运算(?:)、赋值运算(=、+=、-=、*=、/=、%=)的结合性是右结合,其余运算为左结合。3.类型转换一般讲相应的运算只有相应类型的数据才能进行,不同类型数据进行运算时,要进行类型转换。类型转换有自动转换(又称隐含转换)与强制转换两种方式。
(1)自动转换。自动转换由系统自动完成,转换的规则如图3-1所示。Intusignedlongdouble↑↑short,charfloat图3-1
纵向箭头方向表示必定要进行的转换,short型、char型数据必定先转换成int型,float型数据必定先转换成double型,再进行运算。横向箭头方向表示类型自动转换的方向。由低向高转换,int型最低,double型最高。int型与usingned型数据进行运算,int型转换成unsigned;int型与long型数据进行运算,int型转换成long型;int型与double型数据进行运算,int型转换成double型。其它类推。这种转换是一种保值映射,在转换中数据的精度不受损失。(2)强制转换。强制类型转换通过类型转换运算进行。格式:(类型名)(表达式)将表达式的类型强制转换成类型名指定的类型。如:floatx,y;
(int)(x+y)将表达式x+y的值强制转换成整型强制类型转换在将高类型转换为低类型时,数据精度受损,是一种不安全的转换。强制类型转换是暂时性的,一次性的,并不永久改变所转换表达式的类型。如:inta;
(double)a为双精度,a依然为整型量。
例3–1表达式计算。(1)floatx=2.5,y=4.7;inta=7;计算x+a%3*(int)(x+y)%2/4⑦①④③②⑤⑥①a%3等于1。②x+y等于7.2。③(int)(x+y)等于7。④a%3*(int)(x+y)等于7。⑤a%3*(int)(x+y)%2等于1。⑥a%3*(int)(x+y)%2/4等于0。⑦x+a%3*(int)(x+y)%2/4等于2.5+0,结果为2.5。
第二项将由整型自动转换为双精度型进行运算,计算结果为双精度型。(2)inta=2,b=3;floatx=3.5,y=2.5;计算(float)(a+b)/2+(int)x%(int)y②①③⑦④⑥⑤①a+b等于5。②(float)(a+b)等于5.0,强制转换成float型。③(float)(a+b)/2等于5.0/2.0,结果为2.5。④(int)x等于3,强制转换成int型。⑤(int)y等于2,强制转换成int型。⑥(int)x%(int)y等于1。⑦(float)(a+b)/2+(int)x%(int)y等于2.5+1.0,结果为3.5(双精度型)。(3)inti=3;floatf=1.0;doubled=2.3;计算10+′a′+i*f-d①③②④①′a′转换成97,10+′a′等于107。②i,f转换成双精度型,i*f等于3.0。③107转换成双精度型,10+′a′+i*f等于110.0。④10+′a′+i*f-d等于107.7。3.2算术表达式1.自增运算
自增运算符:++
自增运算是单目运算,操作数只能是整型变量,有前置、后置两种方式:++i,在使用i之前,先使i的值增加1,俗称先增后用。
i++,先使用i的值,然后使i的值增加1,俗称先用后增。如:i=1999;j=++i;/*先将i的值增1,变为2000,后使用。j的值也为2000*/j=i++;/*先使用,j的值为1999。后增,将i的值增1,变为2000*/
自增运算优先级处于第2级,结合自右向左。
2.自减运算
自减运算符:--
自减运算与自增运算一样也是单目运算,操作数也只能是整型变量。同样有前置、后置两种方式:--i,在使用i之前,先使i的值减1,俗称先减后用。
i--,先使用i的值,然后使i的值减1,俗称先用后减。如:i=2000;j=--i;/*先减,将i的值减1,变为1999。后使用,j的值也为1999*/j=i--;/*先使用,j的值为2000。后减,将i的值减1,i的值变为1999*/自减运算的优先级、结合性同自增运算。
请特别注意:(1)自增、自减运算只能用于整型变量,不能用于常量或表达式。
(2)自增、自减运算比等价的赋值语句生成的目标代码更高效。
(3)该运算常用于循环语句中,使循环控制变量自动加、减1,或用于指针变量,使指针指向下一个或上一个地址。
(4)表达式中包含有自增、自减运算时,容易出错,务请小心。如:i=1;
(++i)+(++i)+(++i)的值为多少呢?有的计算出9(=2+3+4),其实这是错误的。计算时先对整个表达式扫描,i先自增3次,由1→2→3→4,如此计算结果为4+4+4,等于12。(i++)+(i++)+(i++)的值又是多少呢?类似上面分析,应为3,当然表达式计算完成后i的值同样改变为4。3.运算符的组合问题
C语言的运算符一般为一个字符,有的由两个字符组成,在表达式中出现多个字符时如何组合呢?C编译系统在处理时原则上尽可能自左而右将若干字符组合成一个运算符,标识符、关键字也按同样的原则进行处理。如i+++j,解释为(i++)+j,非i+(++j)。如要表示i+(++j),必须加括号。例3–2
自增自减运算。/*程序3-2,自增自减运算*/#include″stdio.h″main(){inti,j;i=j=5;printf(″i++=%d,j--=%d\n″,i++,j--);printf(″++i=%d,--j=%d\n″,++i,--j);printf(″i++=%d,j--=%d\n″,i++,j--);printf(″++i=%d,--j=%d\n″,++i,--j);printf(″i=%d,j=%d\n″,i,j);}运行结果:i++=5,j--=5++i=7,--j=3i++=7,j--=3++i=9,--j=1i=9,j=13.3赋值表达式3.3.1赋值运算
赋值运算符:=
赋值运算是双目运算,一个操作数为变量,一个操作数为表达式。赋值运算符的右边是表达式,左边是变量。赋值运算时先计算右边表达式的值,然后将右边表达式的值赋给左边变量,即送给左边变量对应的存储单元,并以此作为整个赋值表达式的值。
如:inti;i=3+5%2;/*先计算3+5%2,得到4,然后将4赋给i*/。赋值运算的优先级为第14级,次低,结合自右向左。赋值运算中的表达式操作数最简单的形式是一个常量,这时让变量得到一个初值。如:inti;floatx;charch;i=100;x=12.345;ch=′A′;
赋值运算中表达式操作数又可以是赋值表达式,如此可辗转赋值。如:intx,y,z;x=y=z=0.0;/*相当于x=(y=(z=0.0)),x、y、z都得到值0*/③②①3.3.2赋值类型转换
(1)将实型数据赋给整型变量时,舍弃实数的小数部分。如:inti;i=1.23;/*结果i的值为1*/(2)将整型数据赋给单、双精度型变量时,数值大小不变,但以浮点形式存储到变量中。(3)将字符型数据赋给整型变量时,由于字符数据只占一个字节,而整型变量为两个字节,将字符的数据放整型变量的低8位,而对整型变量的高8位进行扩充。
(4)将基本整型数据赋给长整型变量时,基本整型数据放长整型变量低16位,高16位用符号位扩充。反之将长整型数据赋给整型变量时,只需将长整型数据的低16位原封不动送整型变量中。例如:①inti=-1;longintj;j=i;i的二进制形式:1111111111111111j的二进制形式:11111111111111111111111111111111②longinti=-1;intj;j=i;i的二进制形式:11111111111111111111111111111111j的二进制形式:1111111111111111(5)将无符号整型数据赋给长整型变量时,不存在符号扩展的问题,只需将高位补0即可。将无符号整型数据赋给一个占字节数相同的整型变量时,将无符号整型数据原样送整型变量中,并将最高位当作符号位,如果数据超出相应的整型范围,将产生数据错误。如果将整型数据赋给占字节数相同的无符号整型变量,也是原样照赋,最高位作数值处理。例如:①unsignedinti=65535;intj;j=i;/*j的值为-1*/②inti=-1;unsignedintj;j=i;/*i的值为65535*/
3.3.3复合赋值运算
在基本赋值运算符“=”之前加上任一双目算术运算符及位运算符可构成复合赋值运算符,又称带运算的赋值运算符。算术复合赋值运算符:+=、-=、*=、/=、%=
位复合赋值运算符:&=、|=、^=、>>=、<<=
一般形式:变量☆=表达式等价于:变量=变量☆表达式☆代表任一双目算术运算符或位运算符。复合赋值运算先进行所带运算,再进行赋值运算。复合赋值运算的优先级同赋值运算。(1)inta=3;a+=2等价于a=a+2(2)floatx=1.2,y=2.1;y*=x+3.4等价于y=y*(x+3.4)(3)inta=1,b=2;b/=a+=1,等价于b=b/(a=a+1)例3–3
赋值运算。/*程序3-3,赋值运算*/#include″stdio.h″main(){inti,j;floatx,y;i=j=1;x=y=1.1;printf(″i=%d,j=%d\n″,i,j);x=i+j;y+=1;printf(″x=%4.2f,y=%4.2f\n″,x,y);i=i+++j;x=2*x+y;printf(″i=%d,x=%4.2f\n″,i,x);}运行结果:i=1,j=1x=2.00,y=2.10i=2,x=6.103.4逻辑表达式3.4.1关系表达式
关系表达式是逻辑表达式中的一种特殊情况,关系表达式由关系运算符和操作数组成,关系运算用于完成数的比较运算。关系运算有<、<=、==、!=、>、>=,<、<=、>、>=的优先级相同,==、!=的优先级相同,前者的优先级高于后者。关系运算符的优先级低于算术运算,高于逻辑运算&&、||,也高于赋值运算。
逻辑表达式由逻辑运算符和关系表达式或逻辑量组成,逻辑表达式用于程序设计中的条件描述。
C语言有!、&&、||等三种逻辑运算。!运算的优先级高于算术运算,&&运算高于||运算,&&、||运算低于关系运算,高于赋值运算。3.4.2逻辑表达式&&和||是一种短路运算。所谓短路运算,是指在计算的过程中,只要表达式的值能确定,便不再计算下去
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年合肥市轨道交通集团有限公司招聘考试真题
- 2025年江苏省烟草专卖局(公司)真题
- 崇州市卫生健康局下属事业单位招募医疗卫生辅助岗位考试真题2025
- 哈尔滨市绥化路学校扩建项目水土保持方案报告表
- 主题词 10 想象世界-备战2022年中考语文之“真题+模拟”主题作文专项训练(原卷版)
- 市场主体信用修复管理实施细则
- 机关干部推-荐考察不深入问题整改措施
- 教师资格证管理条例
- 关于加强机关机要工作规范化管理的指导意见
- 机关单位否定报备制度
- 校园消防隐患排查整治
- 产业园运营运作方案
- 2026成都环境投资集团有限公司下属子公司招聘工艺管理岗等岗位21人笔试题库及答案详解【真题汇编】
- 决胜分班考:2026江苏省新高一入学摸底测试全科高频考点与模拟训练
- GB/T 24026-2026环境标志和声明足迹信息交流的原则、要求和指南
- 国企中层干部竞聘测试题库(+答案)
- 施工暖通管道安装方案
- 湖北新八校2026届高三第二次联考(二模)语文试题及参考答案
- 家家悦超市成本控制策略与实践研究
- 永辉超市门店SOP标准作业流程制度规定
- 2026年基层应急管理规范考试试题及答案
评论
0/150
提交评论