C语言全套课件_第1页
C语言全套课件_第2页
C语言全套课件_第3页
C语言全套课件_第4页
C语言全套课件_第5页
已阅读5页,还剩447页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

C语言概述1.1C语言的发展简史与特色1.1.1C语言发展简史

C语言是目前世界上最广泛使用的通用计算机语言。用它既可编写计算机系统软件,也可编写各种应用软件,所以在数百种计算机语言中,C语言仍然是目前最流行、最受欢迎的计算机语言。现在,Windows已成为计算机的主要操作系统,相应的基于Windows的程序开发多采用C++,它虽是一种面向对象的语言,但其核心内容仍是标准C。

C语言是在早期的B语言基础上发展起来的。

C语言于1972年~1973年间,诞生于美国的贝尔实验室,由Denis.M.Ritchie创建。

C语言的产生基于两个方面的需要。一是为满足UNIX操作系统开发的需要。UNIX操作系统是一个通用的、复杂的计算机管理系统。二是为拉近高级语言与硬件之间距离的需要。

C语言集高级语言与汇编语言优点于一身。

C语言面对实际应用的需要而产生,直至今日仍不改初衷。1.1.2C语言的特点

1.它的语言简洁、紧凑,使用方便、灵活。

2.C语言运算丰富,将括号、赋值、强制类型转换、取量地址等都以运算实现。3.运算符多样。

4.函数是程序的主体。函数是程序的基本单位,是C语言的灵魂。5.C语言语法限制不太严格,程序书写自由度大,对程序员要求不高。

6.C语言允许直接访问物理地址。能进行位运算,能实现汇编语言的大部分功能,能直接对硬件进行操作,它是高级语言中的低级语言。

7.C语言编译系统小,生成目标代码质量高,程序执行效率高。8.可移植性好。

1.2C语言的关键字和语句形式1.关键字关键字又称为保留字,由系统提供,用以表示特定的语法成份,是构成C语言的语法基础。常见关键字有32个。①程序控制语句关键字(12个)

if else for do while continue switch break case default goto return ②类型定义说明关键字(12个)

int charfloatdoublelongshort signed unsignedenumstruct union void③存储类别定义说明关键字(4个)auto register static extern④常量、变量定义和自定义类型关键字(3个)const volatile typedef⑤字节测试关键字(1个)sizeof[注意]关键字有特定的语法含义,不允许用户重新定义。关键字在程序中像国家的名字一样,绝对不能拼错。2.语句形式①控制语句

if(~)~else~ /*选择分支语句*/

switch(~)case…;/*多分支语句*/

for(~;~;~)~ /*for循环语句*/

while(~)~ /*while循环语句*/

do~;while(~); /*dowhile循环语句*/

continue; /*无条件进行下一次循环语句*/

break;/*无条件结束当前层循环或跳出switch语句*/

goto~ /*无条件跳转到程序指定处语句*/

return~ /*函数调用结束返回语句*/②函数调用语句函数名(实参表达式表);③表达式语句表达式;④空语句;或{} /*不做任何操作*/⑤复合语句(分程序){~}⑥注释语句/*~*/ /*注释的部分不参加程序编译和运行*/其中“~”代表一个或多个表达式或语句,括号内为表达式,括号外为语句。1.3简单的C程序介绍【例1】计算表达式1-1/2+1/3-1/4+……+1/99-1/100的值。〖分析〗:本问题要计算的是100个分数的和,其中分子都是1,分母分别从1递增排到100,又奇数项的值为负,偶数项的值为正。这样,只要我们计算出每一项的值,然后进行累加即可,这个问题,关键在于解决符号的事。〖算法〗:i).初始化各量:n=1,用于循环计数,同时参与每一项的计算;s=0,用于累加计算出的各项,得到最终所求。ii).计算中间项:n为奇数,t=1/n;否则,t=-1/n。iii).累加各项:s=s+t。iv).重复ii和iii,直到n>100,s即为所求和值。

〖程序〗:#defineN100main(){intn=1;floats=0.0,t;while(n<=100){if(n%2!=0)t=1.0/n;

elset=-1.0/n;

s=s+t;n=n+1;}printf("s=%f\n",s);}〖程序运行结果〗:s=0.688172【例2】给定半径,计算圆的面积。#include"stdio.h"/*文件包含*/#definePI3.1415926/*宏定义*/main()/*主函数*/{floatarea(floatx);/*函数引用说明*/

floatr,s;/*变量定义*/

printf("Inputradius:");/*提示信息*/

scanf("%f",&r);/*键盘输入半径值*/

s=area(r);/*函数调用语句*/

printf("Radius:%f\tArea:%f\n",r,s);/*显示或打印输出结果*/}floatarea(floatx)/*计算面积函数*/{floaty;y=PI*x*x;returny;/*返回计算结果*/}〖运行结果〗:Inputradius:10↙Radius:10.000000 Area:314.159271带下划线的信息表示用户从键盘输入的信息,“↙”表示回车。从上面的程序可以大概看出以下几点:①一个程序可以由多个文件构成,每个文件可以由多个函数构成。每个函数完成一个特定的功能,它由一组语句构成。②一个C程序中有且仅有一个主函数,名为main()。③程序中用到的各种各样的量要先定义后使用,有时还要加上变量引用说明和函数声明。④由“#”开头的行称为宏定义或文件包含,末尾无分号。像这样的语句还有后面要介绍的条件编译,它们都是C语言中的编译预处理命令,而不是真正的语句。语句必须以分号结束。⑤C语言标识符区分大小写字母,系统关键字都是小写字母构成,用户起的变量名、函数名等标识符一般也用小写字母,宏名通常用大写字母表示,以区别于变量名。标识标的起名字符集是:大小写字母、数字、下划线;规则为:不能以数字开头,名称要尽量有一定意义,做到“见名知义”。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进入用户屏幕,查看程序运行结果。运行时发生错误,返回编辑步骤,修改程序后,再编译、运行程序。对于没编译的程序,选择运行会先自动进行编译操作,再运行程序。标识符是一个字符序列,在程序中用来标识变量名、函数名、数组名、类型名、文件名等。标识符又分为系统标识符和用户标识符,其中系统标识符是系统预先定义的,如32个关键字。用户标识符是用户自己定义的。TurboC中标识符的取名规则是:1.只能由大小写英文字母(A~Z,a~z)、数字(0~9)和下划线(_)组成。2.第一个字符不能为数字。3.TurboC中标识符长度不能超过31个字符(有的系统不能超过8个字符)。2.1标识符如:a_b、_ab、a123是合法的标识符1ab、#ab、a%b是不合法的标识符。说明:1.C语言中区分英文字母的大小写。如:a1和A1是两个不同的标识符。2.用户不能定义与关键字同名的标识符。3.用户在定义标识符时,为了增加程序的可读性,尽量做到“见名知义”,并且尽量不用下划线开头(因为系统内部使用了一些以下划线开头的标识符)。2.2数据类型2.3常量和变量

1.常量在程序执行过程中,其值不能被改变,即不能进行赋值运算的量称为常量。C语言中,常量的类型有整型常量、实型常量、字符常量和字符串常量四种。常量的数据类型一般从字面形式就可以判断。如:12、-10为整型常量,3.14、-8.9为实型常量,’a’为字符常量。另外,在C语言中可以用一个标识符代表一个常量,称为符号常量。其定义的一般形式为:#define标识符常量值习惯上,符号常量用大写字母表示,以便与其他标识符相区别。

【例2.1】计算以r为半径的圆的周长、圆的面积和球的体积#definePI3.1415926main(){floatr,l,s,v;scanf("r=%f",&r); l=2*PI*r;s=PI*r*r;v=4.0/3*PI*r*r*r;printf("l=%fs=%fv=%f\n",l,s,v);}〖运行结果〗:r=3↙l=18.849556s=28.274334v=113.0973362.变量在程序执行过程中,其值可以被改变,即可以进行赋值运算的量称为变量。变量通常用来保存程序运行过程中的数据输入,中间结果和最终结果。C语言中,变量必须先定义后使用。(1)变量定义的一般形式为:类型标识符

变量名表;其中,类型标识符表示变量的数据类型,可以是任意数据类型。如整型、实型和字符型等。变量名要符合标识符的取名规则。变量名表可以是一个或多个标识符名,中间用逗号分隔,最后以分号结束。以下是一些变量定义的例子:

inti,j,num;

floata,b,sum;unsignedintui;charc,ch,name;doublex,total;(2)说明①变量必须“先定义后使用”。如果没有定义或说明而使用变量,编译时系统会给出错误信息。②

区分变量和类型。变量是属于某一种数据类型的变量,在编译时编译程序会根据变量的类型为变量分配内存单元,不同类型的变量在内存中分配的字节数不同。

③变量可以在程序内的三个地方定义:在函数内部,在函数的参数(形参)定义中或在所有的函数外部。由此定义的变量分别称为局部变量,形式参数和全局变量。在不同地方定义的变量,其作用范围不同。在同一层次定义的变量,不能与数组、指针、函数和其它变量同名。④在函数内部或函数外部定义变量时,可以为变量赋初值,称为变量的初始化。可以对全部变量初始化,也可对部分变量初始化。对变量初始化的目的是为了使某些变量在程序开始执行时就具有确定的值。如:inta1=10,b1=100;/*对全部变量初始化,a1、b1都为整型变量,初值分别为10和100*/floata2=3.14,b2;/*对部分变量初始化,a2、b2都为单精度实型变量,只对变量a2初始化,其值为3.14,b2没有初始化,其值为随机值。*/如果对同时定义的两个整型变量a、b都初始化为100,必须对每个变量分别初始化。如:inta=100,b=100;不能写成:inta=b=100;⑤同一个变量不能在同一个作用域重复定义,因为编译程序不能对已分配内存单元的变量重新分配内存单元。⑥变量具有存储类别,根据变量定义的位置和形式的不同,可分为自动变量、静态变量、外部变量和寄存器变量。详见第四章。2.4整型数据1.整型常量整型常量就是整数,包括正整数、负整数和0。C语言中整型常量可以用以下三种形式表示:①十进制整数:有效数字为0~9。如正整数20。②八进制整数:有效数字为0~7,且以0开头。如020表示八进制数20,等于十进制数16,-020表示八进制数-20,等于十进制数-16。③十六进制整数:有效数字为0~9和a~f(或A~F),且以0x开头。如0x20表示十六进制数20,等于十进制数32,-0x20表示十六进制数20,等于十进制数-32。2.整型变量整型变量用来存放整型数值。整型变量类型标识符、内存中分配的字节数和值域见表2-1。根据变量的定义形式,可定义整型变量。如:inti1=10;/*i1为整型变量,初值为10,在内存中占2个连续的字节*/longl1,l2;/*l1和l3为长整型变量,在内存中各占4个连续的字节*/unsignedu1;/*u1为无符号整型变量,在内存中占2个连续的字节*/说明:①在TurboC中,把短整型变量作为整型变量处理,把无符号短整型变量作为无符号整型变量处理②如果整型常量的范围是-215~215-1,则认为它是int型,可以把它赋给int型或longint型变量。③如果整型常量的范围是-231~-215+1或215~231-1,则认为它是longint型,可以把它赋给longint型变量。④在一个整型常量的后面加字母l或L,则认为是longint常量。如:0l、123l、345L等。在赋值时,如果不是值域范围的值,在编译时不会出错,但得不到原值,这种现象称为溢出。

2.5实型数据

1.实型常量

实型常量也称“浮点数”,也就是带小数点的数。C语言中,实型常量只使用十进制,它有以下两种形式表示:①十进制小数形式由正负号、数字0~9和小数点组成。如:3.140.80.0-36.625+100.00其中正号“+”可以省略。若整数部分为0,则整数部分可以省略,但小数点不能省略。若小数部分为0,则小数部分可以省略,但小数点不能省略。如:0.8与.8等价,100.00与100.等价②指数形式(或称科学记数法)由正负号、数字0~9、小数点和字母e(或E)组成。它的组织形式为: me±n或mE±n。表示m×10±n,其中m为整型数或实型数,n为整型数,m和n缺一不可,即使m是1或n是0也不能省略,格式中的“+”可以省略。如: 3.14e5123e-41e5.89e90.78e-6是正确的而

e3123e4.0.e54.5ee是错误的。2.实型变量实型变量分为单精度型和双精度型两种,其类型标识符、内存中分配的字节数、有效数字位数和值域见表2-2。

根据变量的定义形式,可定义实型变量。如:floatf1,f2;/*f1和f2为单精度实型变量,在内存中各占4个连续字节*/doubled1=3.4;/*d1为双精度实型变量,初值为3.4,在内存中占8个连续字节*/C语言中的实型常量在内存中以双精度形式存储,一个实型常量既可以赋给一个单精度实型变量,也可赋给一个双精度实型型,系统会根据变量的类型自动截取实型常量中相应的有效位数字。

2.6字符型数据

1.字符常量C语言中,用一对单引号括起来的一个字符称为字符常量,如’a’、’7’、’#’等。一个字符常量的值就是该字符的ASCII码。如字符常量’a’的ASCII码为97,字符常量’A’的ASCII码为65,由此可知’a’和’A’是两个不同的字符常量。除了以上形式的字符常量外,C语言中还允许使用一种特殊形式的字符常量,即以“\”开头的字符序列,称为“转义字符”,用来表示一些难以用一般形式表示的字符。常用的转义字符见表2-3。转义字符开头的“\”,并不代表一个斜杠字符,其含义是将后面的字符或数字转换成另外的意义;另外,转义字符仍然是一个字符,仍然对应于一个ASCII值。如“\n”中的“n”不代表字母n,而是代表“换行”符,其ASCII值为10。2.字符变量字符型变量分为有符号字符型(简称字符型)和无符号字符型两种,其类型标识符、内存中分配的字节数和ASCII码范围见表2-4根据变量的定义形式,可定义字符型变量。如:charc1,c2,c3;/*c1、c2和c3为字符型变量,在内存中各占1个字节*/unsignedcharch1,ch2;/*ch1和ch2为无符号字符型变量,在内存中各占1个字节*/在对字符变量赋值时,可以把字符常量(包括转义字符)赋给字符变量。如:

c1=’a’;c2=’\376’;3.字符数据和整型数据的关系

把一个字符常量赋给一个字符变量,实际上将该字符常量对应的ASCII码存放到为变量所分配的内存单元。在C语言中字符型数据和整型数据之间可以通用:①字符常量与其对应的ASCII码通用。②带符号字符变量和值在-128~127之间的整型变量通用。③无符号字符变量和值在0~255之间的整型变量通用。一个字符数据既可以以字符形式输出,也可以以整数形式输出。以字符形式输出时,需要先将存储单元中的ASCII码转换成相应字符,然后再输出。以整数形式输出时,直接将ASCII码作为整型数输出。字符型数据可以进行算术运算,此时是对它的ASCII码进行算术运算。【例2.2】main(){inti=65;charch=’A’;printf("i=%dch=%c\n",i,ch);/*输出:i=65ch=A*/printf("i=%cch=%d\n",i,ch);/*输出:i=Ach=65*/i=’A’;/*把字符常量赋给整型变量*/

ch=65;/*把整型常量赋给字符变量*/

printf("i=%dch=%c\n",i,ch);/*输出:i=65ch=A*/printf("i=%cch=%d\n",i,ch);/*输出:i=Ach=65*/}2.7字符串常量C语言中,用一对双引号括起来的一个字符序列。字符序列可以是零个、一个或多个字符。字符序列中含有字符个数称为字符串的长度。如:

"china"长度为5 "a"长度为1

"□□"空格串,长度为2 ""空串,长度为0说明:①字符串常量在存储时除了存储双引号中的字符序列外,系统还会自动在最后一个字符的后面加上一转义字符’\0’,所以一个字符串常量在内存中所占的字节数是字符串长度加1。如"china"的长度为5,而在内存中占的字节数为6。②’\0’是ASCII码为0的空操作字符,C语言规定用’\0’作为字符串的结束标志,目的是以便系统据此判断字符串是否结束。③区别’A’和"A",前者为字符常量,后者是以’\0’结束的字符串常量。④字符串常量中的字符可以是转义字符,但它只代表一个字符。如:字符串"ab\n\\cd\e"的长度是7,而不是10。⑤不能将字符串常量赋给字符变量。如下面的赋值是错误的:c1="a"; c2="china";C语言中没有专门的字符串变量,字符串如果需要存放在变量中,需要用字符数组来存放,即用一个字符型数组来存放一个字符串。2.8变量及指针

内存中每一个字节都有一个确定其位置的地址,而每个变量在编译时都在内存分配连续的一定字节数的存储单元,变量分配的存储单元的第一字节的地址就是该变量的地址。一个变量的地址值可以通过取地址符&得到,其一般格式为:&变量名。C允许通过定义一个变量来存放另一变量的地址,这样的变量就称作指针变量。1.指针变量的定义和初始化

指针是一种存放地址值的变量,像其它变量一样,必须在使用前定义。指针变量的命名遵守与其它变量相同的规则,

即必须是唯一的标识符。指针定义的格式如下:类型名*指针名;如:int*p1;/*p1是一个指针变量,用来存放整型变量的地址*/在函数内或函数外可以同时定义多个指针变量,也可以同时定义普通变量和指针变量。如:int*p1,*p2,a1;其中,a1是普通变量,用来存放整型数。p1和p2是指针变量,用来存放整型变量的地址。可以对指针变量初始化。如:inta=10,*p=&a;等价于:inta=10,*p;p=&a;把变量a的地址赋给了指针变量p,此时称指针变量p“指向”整型变量a。如果要把一个变量的指针初始化给一个指针变量,该变量必须在指针变量定义之前定义。如下列初始化错误的:int*p1=&a;inta=10;其道理很简单,变量只有定义后才被分配一定的内存单元。需要注意的是:定义指针变量时的数据类型不是指针变量中存放的数据类型,而是它要指向的变量的数据类型。也就是说定义成某种数据类型的指针变量,将来只能用来指向该类型的其他变量。

2.指针变量的引用访问指针变量所指向的变量用间接访问运算符“*”。其一般格式为:*指针变量名若有定义:inta=10,*p=&a;则*p为指针变量p所指向的变量,即变量a,其值为10。【例2.3】main(){inta=10;int*p;p=&a;printf("%d%d",a,*p);}〖运行结果〗1010说明:①定义变量时,变量名前加“*”,表示该变量为指针变量,使用指针变量时,指针变量前加“*”,表示该指针变量所指向的变量。如:例2.3第三行的*p表示定义指针变量p,p前面的“*”只表示p为指针变量。第五行printf()函数中的*p则代表p所指向的变量,即变量a。②指针变量在使用前一定要赋予一定的地址值,如果指针变量在使用前没有赋值,其值不确定,使用时容易出错,严重时会造成系统瘫痪。③不能将普通类型数据(0除外)直接赋给指针变量。若p是指针变量,下面的赋值是不合法的:p=100;④指针变量赋值时,类型一定要匹配,不能将一个指针直接赋给与它类型不同的指针变量。若有定义:inta,*p1=&a;floatp2;则下面的赋值是不合法的:

p1=p2;若想赋值,必须通过强制类型转换,如:

p2=(float*)p1;其原因是:不同类型的指针变量,它们访问的存储单元的大小不同。如:char型指针为1个字节,int型指针为连续2个字节,float型指针为连续4个字节,double型指针为连续8个字节。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优先级次高,算术运算+、-、*、/、%再次之,然后是关系运算<、<=、==、![KG-*4]=、>、>=,再然后是逻辑运算&&、||,条件运算式?:,赋值运算=、+=、-=、*=、/=、%=,逗号运算优先级最低,位运算优先级比较分散。2.运算符的结合性

运算符的结合性是指,优先级相同的运算从左到右进行(左结合性)还是从右至左进行(右结合性),左结合性是人们习惯的计算顺序。

C语言中,只有单目运算(!、~、++、--、-、*、&)、条件运算(?:)、赋值运算(=、+=、-=、*=、/=、%=)的结合性是右结合,其余运算为左结合。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.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的二进制形式:1000000000000001j的二进制形式:11111111111111111000000000000001②longinti=-1;intj;j=i;i的二进制形式:10000000000000000000000000000001j的二进制形式:0000000000000001(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)e1&&e2,若e1为0,可确定表达式的值为0,不再计算e2。(2)e1||e2,若e1为真,则可确定表达式的值为真,也不再计算e2。例3—4用逻辑表达式描述下列条件:(1)x是3的倍数。x%3==0(2)x是偶数。x%2==0(3)x是3的倍数且x是偶数。(x%3==0)&&(x%2==0)(4)100<x<200。(x>100)&&(x<200)(5)x等于2或8。(x==2)||(x==8)(6)某年是否为闰年。(year%400==0)||((year%4==0)&&(year%100!=0))3.5位运算表达式3.5.1位逻辑运算1.按位取反运算

运算符:~按位取反运算用来对一个二进制数按位取反,即0位变1,1位变0。例如:~25,25的二进制表示为:0000000000011001按位取反得结果:1111111111100110,即-26。~运算常用于产生一些特殊的数。如高8位全1低8位全0的数0xFF00,按位取反后变为0x00FF。~1,在16位与32位的系统中,都代表只有最低位为0的整数。~运算是位运算中唯一的单目运算,也是唯一具有右结合性的位运算。2.按位与运算

运算符:&按位与运算的规则是操作数的对应位都为1,则该位的运算结果为1,否则为0。例如:0x29&0x37,0x29与0x37的二进制表示为:0000000000101001与0000000000110111按位与结果为:00000000000100001,即0x21。

按位与运算主要用途是清零及取数的某些位或保留数的某些位。例如:(1)a&0,将a清0。(2)a&0xFF00,取数a的高8位,低8位清0。(3)a&0x00FF,取数a的低8位,高8位清0。3.按位或运算运算符:|按位或运算的规则是操作数的对应位都为0,则该位的运算结果为0,否则为1。例如:0x29|0x37,0x29与0x37的二进制表示为:0000000000101001与0000000000110111按位或结果为:0000000000111111,即等于0x3f。

利用|运算可将数的部分位或所有位置1。例如:a|0x000F,a的低4位全置1,其它位保留。a|0xFFFF,a的每一位全置1。4.按位异或运算运算符:^按位异或运算的规则是操作数的对应位相同,则该位的运算结果为0,否则为1。例如:0x29^0x37,0x29与0x37的二进制表示为:0000000000101001与0000000000110111按位异或结果为:0000000000011110,即等于0x1e。

利用^运算将数的特定位翻转,保留原值,不用临时变量交换两个变量的值。例如:(1)a^0x00FF,将数a的低8位翻转,高8位不变。(2)a^0,保留数a的原值。(3)a=a^b,b=b^a,a=a^b,不用临时变量交换a#,b的值。位逻辑运算自身的优先级由高到低依次是~、&、|、^,在整个运算体系中~运算的优先级位于第二级,&、|、^运算低于关系运算,高于逻辑运算。位逻辑运算意义与逻辑运算一样,但位逻辑运算对二进制位而言,且必须对数的所有二进制位进行,而且操作数只能为整数。如果参与运算的数据长度不同,将对短的数据先进行高位符号扩展后再进行位运算。3.5.2移位运算1.左移位运算运算符:<<移位运算的左操作数是要进行移位的整数,右操作数是要移的位数。左移位运算规则是高位左移后溢出,舍弃,空出的右边低位补0。例如,15<<2,15的二进制表示为:0000000000001111左移2位结果为:0000000000111100,等于60。左移1位相当于该数乘以2,左移2位相当于该数乘以4(22)。使用左移位运算可以实现快速乘2运算。2.右移位运算

运算符:>>右移位运算规则是低位右移后被舍弃,空出的左边高位对无符号数移入0。如果是有符号数,对正数空出的左边高位移入0;如果是负数,则左边移入0还是1,要取决于所用编译系统,有的移入0(逻辑右移),有的移入1(算术右移)。例如,15>>2,右移2位,等于0000000000000011,即3。右移1位相当于该数除以2,右移2位相当于该数除以4(22)。使用右移位运算可以快速实现除2运算。移位运算低于算术运算,高于关系运算。位运算与赋值运算可组合成复合赋值运算&=、|=、^=、<<=、>>=。例3—5取一个整数a的从右端开始的4~7位。/*程序3—5,取一个整数a的从右端开始的4~7位*/#include″stdio.h″main(){unsigneda,b,c,d;scanf(″%o″,&a);/*八进制形式输入*/b=a>>4;/*a右移4位*/c=~(~0<<4);/*得到一低4位全为1,其余位为0的数*/d=b&c;/*取b的0~3位,即得到a的4~7位*/printf(″a=%o,a(4~7)=%o″,a,d);}输入数据:331运行结果:a=331,a(4~7)=153.6其它表达式3.6.1条件表达式条件表达式由条件运算符和操作数组成,用以将条件语句以表达式的形式出现,完成选择判断处理。条件运算符由“?”和“:”组成。条件运算是三目运算,有三个操作数,一般形式如下:表达式1?表达式2:表达式3表达式1必须为逻辑表达式,如表达式1为真,计算表达式2,并以此作为整个表达式的值。如表达式1为假,计算表达式3,并以此作为整个表达式的值。(1)a>b?a:ba大于b,表达式的值为a;a小于b,表达式的值为b。实际上求a、b的最大值。(2)a>0?a:-aa大于0,表达式的值为a;a小于等于0,表达式的值为-a。实际上求a的绝对值。条件运算的优先级为倒数第3级,高于赋值运算,低于逻辑运算,结合从右至左。如a>b?a:c>d?c:d,相当于a>b?a:(c>d?c:d)例3—6判断整数的正负。/*程序3—6,判断整数的正负*/#include″stdio.h″main(){intx;scanf(″%d″,″&x″);x>0?printf(″%s″,″正数″):printf(″%c″,″负数″);}3.6.2逗号表达式逗号表达式由逗号运算符和操作数组成,用以将多个表达式连接成一个表达式。逗号运算符:,逗号运算是双目运算,一般形式如下:表达式1,表达式2先计算表达式1,再计算表达式2,并以此作为整个表达式的值。如a=2,a*6,先计算a=2,再计算a*6,并以此作为整个表达式的值,表达式的值为12。逗号运算的优先级最低,结合自左向右。逗号表达式的更一般使用形式为:表达式1,表达式2,表达式3,……,表达式n

先计算表达式1,再计算表达式2,再计算表达式3,…,再计算表达式n的值,并以此作为整个表达式的值。如表达式x=a=3,6*x,6*a,a+x的值为6。逗号运算又称顺序求值运算。3.6.3其它运算

1.取地址运算

运算符:&取地址运算是单目运算,操作数只能是变量,得到变量的地址。C语言程序设计中许多场合要使用到地址数据。如输入函数scanf(),输入参数就要求是地址表,将读入的数据送变量对应的存储单元中。取地址运算的优先级次高。

C语言还提供一个指针运算“*”,用于取存储单元的内容.2.求字节数运算运算符:sizeof

求字节数运算是单目运算,操作数可以是类型名,也可以是变量、表达式,用以求得相应类型或数据所占的字节数。此运算的优先级与取地址运算优先级相同。4.1C语句概述

C语言是函数式语言,每一个函数是由数据说明部分和执行语句部分组成。C语言中的所有语句均是执行语句,没有非执行语句。根据C语言的句法,语句可分为单个语句,复合语句和空语句。根据结构化程序设计的三个模块大致可分为:用于顺序结构中的表达式语句、赋值语句、函数调用语句等;用于分支结构中的if语句、switch语句、转移语句、标号语句等;用于循环结构中的while语句、for语句、do-while语句。另外在后两种结构中还可出现break语句、continue语句、复合语句和空语句等作为其中的一部分。(1)逻辑上每个语句最后都必须有一个分号(;),一个语句可分写成几行,几个语句也可合写成一行(但不提倡,因其不利于单步调试)。(2)空语句直接由分号(;)组成,常用于控制语句中必须出现语句之处,它不做任何操作,只在逻辑上起到有一个语句的作用。(3)复合语句由花括号{}括起的若干个语句,语法上可以看成是一个语句。复合语句中最后一个语句的分号不能省略。如下面是一个复合语句:{z=x+y;y=x/z;x=z-y;}(4)表达式语句是在各种表达式后加一个分号(;)形成一个语句。如赋值语句由赋值表达式加一个分号构成:

x=x+y;再如表达式x++后加一个分号构成表达式语句:

x++;

表达式和表达式语句的区别是表达式后无分号,可以出现在其它语句中允许出现表达式的地方;而表达式语句后有分号,自己独立成一个语句,不能再出现在其它语句的表达式中。如:

if((a=b)<0)min=a;(5)控制语句有条件判断语句(if、switch),循环语句(for、while、do-while),转移语句(goto、continue、break、return)。4.2基本输入输出函数

4.2.1字符输出函数—putchar()一般调用格式:putchar(参数)其中,参数可以是任意类型表达式,一般为算术表达式。功能:向显示器输出一个字符。返回值:如果输出成功,返回值就是输出的字符,否则返回EOF(-1)。如:putchar(’a’)/*输出字符a*/putchar(65)/*输出ASCII码为65的字符A*/putchar(’a’+2)/*输出字符c*/putchar(’\n’)/*输出一个换行符*/说明:1.putchar()函数一次只能输出一个字符,即该函数有且只有一个参数。2.putchar()函数可以输出转义字符。3.在使用函数putchar()前,一定要使用文件包含:

#include"stdio.h"或#include<stdio.h>

【例4.1】#include"stdio.h"main(){chara,b,c;

a=’o’;b=’u’;c=’t’;putchar(a);putchar(b);putchar(c);putchar(’\n’);putchar(65);putchar(’\t’);putchar(’B’);putchar(a-10);}〖运行结果〗:outA□□□□□□□Be(□代表空格)4.2.2字符输入函数—getchar()

一般调用格式:getchar()功能:从键盘读入一个字符。返回值:如果读入成功,返回值就是读入的字符,否则返回EOF(-1)。说明:1.getchar()函数一次只能接收一个字符,即使从键盘输入多个字符,也只接收第一个。空格和转义字符都作为有效字符接收。2.接收的字符可以赋给字符型变量或整型变量,也可以不赋给任何变量,作为表达式的一部分。3.getchar()函数是无参函数。4.从键盘上输入的字符不能带单引号,输入以回车结束。5.在使用函数getchar()前,一定要使用文件包含: #include"stdio.h"

或#include<stdio.h>【例4.2】#include"stdio.h"main(){charch1,ch2,ch3;ch1=getchar();ch2=getchar()ch3=getchar();putchar(ch1);putchar(ch2);putchar(ch3);}在运行时,若从键盘上输入:C↙G↙则第一个getchar()接收的是C,第二个getchar()接收的是回车,第三个getchar()接收的是G。输出结果为:C(输出ch1的值)G(输出ch3的值)4.2.3格式输出函数—printf()一般调用格式:printf("格式控制字符串",输出表列)功能:按指定格式向显示器输出数据。返回值:输出成功,返回输出字节数;否则返回EOF(-1)。输出表列:是要输出的数据,可以没有,有两个或两个以上时,用逗号(,)分隔。输出表列中的输出项可以是常量,可以是变量,也可以是表达式。格式控制字符串:由普通字符和格式说明两部分组成。普通字符,即需要原样输出的字符,包括转义字符;格式说明是以%开始,以一个格式字符结束,中间可以插入附加格式说明符,它的作用是将输出的数据转换为指定的格式输出,其一般形式为: %[附加格式说明符]格式字符

printf()函数的格式字符和常用的附加格式说明符分别见表4-1和表4-2。表4-1printf()函数格式字符

按%f格式输出实型数据时,整数部分全部输出,小数部分保留六位。

在TurboC中,按%e格式输出实型数据时,输出占十一位,其中整数部分占一位,小数部分占五位,指数部分占四位,小数点占一位。如:printf("%f",123.4);的输出结果为:123.400000

printf("%e",123.4);的输出结果为:1.23400e+02

表4-2printf()函数常用的附加格式说明符【例4.3】main(){charch=’A’;inta=1234;floatb=123.4562222;printf("ch=%c\n",ch);/*输出:ch=A*/printf("ch=%3c\n",ch);/*输出:ch=□□A*/printf("a=%6d\n",a);/*输出:a=□□1234*/printf("a=%2d\n",a);/*输出:a=1234*/printf("a=%#o\n",a);/*输出:a=02322*/printf("a=%#x\n",a);/*输出:a=0x4d2*/printf("b=%f\n",b);/*输出:b=123.456223*/printf("b=%8.2lf\n",b);/*输出:b=□□123.46*/printf("b=%-8.2f\n",b);/*输出:b=123.46□□*/

printf("b=%.2f\n",b);/*输出:b=123.46*/printf("b=%e\n",b);/*输出:b=1.23456e+02*/printf("b=%8.2e\n",b);/*输出:b=□1.2e+02*/printf("b=%-8.2le\n",b);/*输出:b=1.2e+02*/printf("b=%.2e\n",b);/*输出:b=1.2e+02*/printf("str=%s\n","china");/*输出:china*/printf("str=%8.3s\n","china");/*输出:□□□□□chi*/printf("str=%-6.3s\n","china");/*输出:chi

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论