版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第3章数据类型、运算符和表达式3.1数据类型常量3.2变量3.33.4运算符和表达式3.5数据类型转换本章内容导读本章主要介绍C语言的基本数据类型以及变量的定义方法,基本运算符的运算规则、优先级和结合性以及表达式的构成等。通过学习本章,读者应掌握以下内容:了解C语言的各种数据类型和运算符;掌握各种基本数据类型常量和字符串常量的书写方法;掌握常量和变量的定义、初始化和赋值方法;掌握基本运算符的运算规则、优先级和结合性;掌握表达式计算和变量赋值时数据类型转换的规则。C语言提供的数据结构,以数据类型的形式出现。包括:基本类型包括整型、实型(又称浮点型)、字符型和枚举型四种。构造类型由基本数据类型按一定规则组合而成的复杂数据类型,包括数组类型、结构体类型和共用体类型三种。指针类型用来表示内存地址。空类型从语法完整性角度给出的数据类型,表示不需要数据值,因而没有类型。C语言中的数据,有常量和变量之分,分别属于上述的类型。本章主要介绍基本类型中的整型、实型和字符型三种。3.1数据类型概念在程序运行过程中,其值不能改变的量,又称为常数。
分类
(1)整型常量(2)实型常量(3)字符型常量
(4)字符串常量(5)符号常量常量的类型,系统可通过书写形式自动识别,无需定义。3.2常量表示形式又称为整数,C语言中有三种形式:(1)十进制整型常量,例如10、36。(2)八进制整型常量(必须以数字0开头),例如012。(3)十六进制整型常量(必须以0X或0x开头),例如0x36。分类(1)基本整型(2)长整型(在数值后面加L或l):对超出基本整型值域的整型常量,可使用长整型常量表示,例如123l、315L等。(3)短整型1、整型常量3.2常量类型匹配规则一个整型常量,可以赋给能容纳下其值的整型变量。例如,其值在-215至(215-1)的整型常量,可以赋给int型变量和longint型变量;其值在-231至(231-1)的整型常量,则只能赋给longint型变量。注意:常量没有unsigned型。但一个非负整型常量,只要其值不超过相应变量的取值范围,也可以赋给unsigned型变量。1、整型常量3.2常量表示形式
又称为浮点型常量或实数,有两种表达形式:
(1)十进制小数形式,例如3.14、9.8。(2)指数形式:<尾数>E(或e)<整型指数>,例如3.0E+5等。说明
实型常量不分float型和double型。一个实型常量,可以赋给一个实型变量(float型或double型)。2、实型常量3.2常量定义用一对单引号括起来的单个字符,例如'a'、'+'等。转义字符C语言还允许使用一种特殊形式的字符常量,以反斜杠“\”开头的转义字符。注意(1)如果反斜杠或单引号或双引号本身作为字符常量,必须写成转义字符的形式,即
'\\'、'\''、'\"',而不能直接写成
'\'、'''、'"'。(2)C语言规定字符常量中的字母是区分大小写的,例如
'x'和'X'是不同的字符常量。(3)C语言中空字符和空格符号不同。空字符用转义字符'\0'表示,其值是0;空格符号是ASCII字符集中的一个可显示字符,其ASCII值是32,在屏幕上显示为空格。3、字符常量3.2常量定义字符串常量是用一对双引号括起来的若干字符序列。长度字符串中字符的个数称为字符串长度。长度为0的字符串(即一个字符都没有的字符串)称为空串,表示为""
(一对紧连的双引号)。例如
"Howdoyoudo."、"Goodmorning."等,都是字符串常量,其长度分别为14和13(空格也是一个字符)。
如果反斜杠和双引号作为字符串中的有效字符,则必须使用转义字符。例如(1)C:\msdos\v6.22→"C:\\msdos\\v6.22"
(2)Isay:"Goodbye!"→"Isay:\"Goodbye!\""
4、字符串常量3.2常量存储C语言规定:存储字符串常量时,由系统在字符串的末尾自动加一个'\0'作为字符串的结束标志。注:在源程序中书写字符串常量时,不必加结束字符'\0'
,否则画蛇添足。
例如字符串"CHINA",其在内存中实际存储为:最后一个字符'\0'是系统自动加上的,占用6个字节而非5个字节的内存空间。CHINA\0说明:字符常量'A'与字符串常量"A"是不同的。(1)定界符不同:字符常量使用单引号,而字符串常量使用双引号;(2)长度不同:字符常量的长度固定为1,而字符串常量的长度,可以是0,也可以是某个整数。4、字符串常量3.2常量格式为了在程序中明确表示某些常量的含义,可以给常量取一个容易识别的名字,且符合标识符的命名规则。#define符号常量常量其中,常量可以是任意类型。#define是一个编译预处理命令,称为宏定义命令。
注:符号常量一般采用大写字母表示,而变量一般采用小写字母表示。符号常量使用之前必须先定义。符号常量的定义一般放在程序的开头,每个定义必须独占一行,因为不是语句,所以后面没有分号;。5、符号常量3.2常量定义在程序运行过程中,其值可以改变的量。特点(1)变量名。每个变量都必须有一个名字,变量命名遵循标识符命名规则。(2)变量值。在程序运行过程中,变量值存储在内存中。程序中通过变量名引用变量的值。变量值的数据类型与变量的数据类型一致。命名规则(1)有效字符:只能由字母、数字和下划线组成,且以字母或下划线开头。(2)有效长度:随系统而异。3.3变量例如,由于student_name和student_number的前8个字符相同,有的系统认为这两个变量相同而不加区别。(3)C语言的关键字不能用作变量名。注意:C语言对英文字母的大小写敏感,即同一字母的大小写,被认为是两个不同的字符。习惯上,变量名和函数名中的英文字母用小写,以增加可读性。标识符命名的良好习惯──见名知意所谓“见名知意”即通过变量名就知道变量值的含义。通常应选择能表示数据含义的英文单词(或缩写)作变量名,或汉语拼音字头作变量名。例如,name/xm(姓名)、sex/xb(性别)、age/nl(年龄)、salary/gz(工资)。3.3变量C语言中,要求对所有变量,必须先定义、后使用;在定义变量的同时进行赋初值的操作称为变量初始化。
定义格式
数据类型符变量名1[,变量名2,……];例如floatradius,length,area;
初始化格式
数据类型符变量名1[=初值1][,变量名2[=初值2],……];
例如floatradius=2.5,length,area;3.3变量分类根据占用内存字节数的不同,整型变量分为四类:(1)基本整型(类型关键字int)(2)短整型(类型关键字short[int])(3)长整型(类型关键字long[int])(4)无符号整型。又分为无符号基本整型(unsigned[int])、无符号短整型(unsignedshort)和无符号长整型(unsignedlong)三种,只能用来存储无符号整数。
1、整型变量3.3变量占用内存字节数与值域上述各类整型变量占用的内存字节数,因系统而异。16位系统中,一般用2字节表示一个int型变量,且long型(4字节)≧int型(2字节)≧short型(2字节)。不同类型的整型变量,其值域不同。占用内存字节数为n的(有符号)整型变量,其值域为-2n*8-1至2n*8-1-1;无符号整型变量的值域为0至2n*8-1。例如,PC机中的一个int型变量,其值域为-22*8-1至22*8-1-1,即-32768至32767;一个unsigned型变量的值域为0至22*8-1,即0至65535。1、整型变量3.3变量分类
(1)单精度型。类型关键字为float,一般占4字节,提供7位有效数字。
(2)双精度型。类型关键字为double,一般占8个字节,提供15至16位有效数字。
2、实型变量3.3变量字符型变量的类型关键字为char,占用1字节内存单元。存储
字符型变量用来存储字符常量。将一个字符常量存储到一个字符变量中,实际上是将该字符的ASCII码值(无符号整数)存储到内存单元中。例如charch1,ch2;/*定义两个字符变量ch1、ch2*/
ch1='a';ch2='b';/*给字符变量赋值*/特点
字符数据在内存中存储的是字符的ASCII码─一个无符号整数,其形式与整数的存储形式一样,所以C语言允许字符型数据与整型数据之间通用。(1)一个字符型数据,既可以字符形式输出,也可以整数形式输出。(2)允许对字符数据进行算术运算,即对其ASCII码值进行算术运算。
3、字符型变量3.3变量【例3-1】字符型变量的字符形式输出和整数形式输出。
#include<stdio.h>intmain(void)
{ charch1,ch2;
ch1='a';ch2='b';
printf("ch1=%c,ch2=%c\n",ch1,ch2);
printf("ch1=%d,ch2=%d\n",ch1,ch2); return0;
}
程序运行结果:
ch1=a,ch2=b
ch1=97,ch2=983、字符型变量3.3变量
C语言中,如果定义了变量并赋予其初值,但不希望在程序中对其值进行修改,则可以将该变量定义为有名常量。定义格式const
数据类型符变量名1=初值1[,变量名2=初值2,…];注:有名常量主要用于程序运行过程中,其值不允许改变的量。定义后,若在程序中改变其值,将出错。4、有名常量3.3变量C语言中,除控制语句和输入输出函数外,其它所有基本操作都作为运算符处理。
基本算术运算符+、-(减法/取负)、*、/、%(求余数)注意:两个整数相除,其商为整数,小数部分被舍弃。例如,5/2=2。对于求余数运算%,要求两侧的操作数均为整型数据,否则出错。表达式用运算符和括号将运算对象(常量、变量和函数等)连接起来的、符合C语言语法规则的式子,称为表达式。单个常量、变量或函数,可看作是表达式的一种特例。将单个常量、变量或函数构成的表达式称为简单表达式,其它表达式称为复杂表达式。3.4运算符和表达式优先级运算符结合性1[]()->.从左至右2!~++---*&sizeof从右至左3*/%从左至右4+-从左至右5<<>>从左至右6<<=>>=从左至右7==!=从左至右8&从左至右9^从左至右10|从左至右11&&从左至右12||从左至右13?:从右至左14=+=-=*=/=%=&=^=|=>>=<<=从右至左15,从左至右优先级和结合性结合性是指当一个操作数两侧的运算符具有相同的优先级时,该操作数是先与左边的运算符结合,还是先与右边的运算符结合。自左向右的结合方向,称为左结合性。反之,称为右结合性。结合性是C语言的独有概念。除单目运算符、赋值运算符和条件运算符是右结合性外,其它运算符都是左结合性。运算规则(1)按运算符的优先级高低次序执行。例如,先乘除后加减。(2)如果在一个运算对象(或称操作数)两侧的运算符的优先级相同,则按C语言规定的结合方向进行。例如,算术运算符的结合方向是“自左至右”,即执行a-b+c时,先执行a-b;然后再执行加c的运算。3.4运算符和表达式算术运算符包括+、-、*、/、%、+(取正)和-(取负)。
名称运算符运算对象个数功能运算对象类型结果类型结合性正+单目前缀取正整型或实型整型或实型从右至左负-取负加+双目中缀加法从左至右减-减法乘*乘法除/除法模%整除取余整型整型1、算术运算符和算术表达式3.4运算符和表达式自增(++)、自减(--)运算符
单目运算符,用于对整型、字符型和指针型变量的值加1和减1的运算,运算结果仍是原来的数据类型。使用方法(1)前置运算──运算符放在变量之前:++变量、--变量。
先使变量的值增(或减)1,然后再以变化后的值参与其它运算,即先增减、后运算。(2)后置运算──运算符放在变量之后:变量++、变量--。
变量先参与其它运算,然后再使变量的值增(或减)1,即先运算、后增减。
1、算术运算符和算术表达式3.4运算符和表达式说明(1)自增、自减运算,常用于循环语句中,使循环控制变量加(或减)1,以及指针变量中,使指针指向下(或上)一个地址。(2)自增、自减运算符,不能用于常量和表达式。例如,5++、--(a+b)等都是非法的。(3)在表达式中,连续使同一变量进行自增或自减运算时,很容易出错,所以最好避免这种用法。1、算术运算符和算术表达式3.4运算符和表达式【例3-2】自增、自减运算符的用法与运算规则。#include<stdio.h>
intmain(void){
intx=6,y;
printf("x=%d\n",x);/*输出x的初值*/ y=++x; /*前置运算*/
printf("y=++x:x=%d,y=%d\n",x,y); y=x--; /*后置运算*/
printf("y=x--:x=%d,y=%d\n",x,y); return0;}程序运行结果:x=6y=++x:x=7,y=7y=x--:x=6,y=7“关系运算”实际上是“比较运算”,即将两个数据进行比较,判定两个数据是否符合给定的关系。例如,a>b中的>表示大于关系运算。如果a的值是5,b的值是3,则大于关系运算的结果为“真”,即条件成立;如果a的值是2,b的值是3,则大于关系运算的结果为“假”,即条件不成立。关系运算符
<(小于)<=(小于或等于)>(大于),
>=(大于或等于)==(等于)!=(不等于)注意:“等于”关系运算符是双等号“==”,而不是单等号“=”(赋值运算符)。
2、关系运算符和关系表达式3.4运算符和表达式优先级和结合性(1)>、>=、<、<=优先于==、!=;(2)>、>=、<、<=的优先级相同,结合性是从左至右;(3)==、!=的优先级相同,结合性是从左至右。(4)关系运算符的优先级低于算术运算符,但高于赋值运算符。关系表达式(1)概念关系表达式是指用关系运算符将两个表达式连接起来进行关系运算的式子。例如下面的关系表达式都是合法的:
a>b,a+b>c-d,(a=3)<=(b=5),'a'>='b',(a>b)==(b>c)
(2)关系表达式的值——逻辑值(非“真”即“假”)。2、关系运算符和关系表达式3.4运算符和表达式假设n1=3,n2=4,n3=5,则:(1)n1>n2的值是0。(2)(n1>n2)!=n3的值是1。(3)n1<n2<n3的值是1。(4)(n1<n2)+n3的值是6,因为n1<n2的值是1,1+5=6。注意:由于C语言没有逻辑型数据,用整数“1”表示“逻辑真”,用整数“0”表示“逻辑假”。所以,关系表达式的值,还可以参与其它种类的运算,例如算术运算、逻辑运算等。2、关系运算符和关系表达式3.4运算符和表达式关系表达式只能描述单一条件,例如x>=0。如果需要描述x>=0同时x<10,则需借助于逻辑表达式。逻辑运算符&& 逻辑与(相当于“同时”)|| 逻辑或(相当于“或者”)! 逻辑非(相当于“否定”)例如下面的表达式都是合法的逻辑表达式:(x>=0)&&(x<10)(x<1)||(x>5)!(x==0)
(year%4==0)&&(year%100!=0)||(year%400==0)3、逻辑运算符和逻辑表达式3.4运算符和表达式运算规则例如,假设x=5,则(x>=0)&&(x<10)的值为“真”,(x<-1)||(x>5)的值为“假”。aba&&ba||b0(假)0(假)0(假)0(假)0(假)非0(真)0(假)1(真)非0(真)0(假)0(假)1(真)非0(真)非0(真)1(真)1(真)3、逻辑运算符和逻辑表达式3.4运算符和表达式优先级和结合性(1)!优先于双目算术运算符优先于关系运算符优先于&&优先于||;(2)单目逻辑运算符!和单目算术运算符的优先级相同,结合性是从右至左;(3)双目逻辑运算符&&和||的结合性是从左至右。逻辑表达式逻辑表达式是指用逻辑运算符将一个或多个表达式连接起来,进行逻辑运算的式子。C语言中,用逻辑表达式表示多个条件的组合。例如(year%4==0)&&(year%100!=0)||(year%400==0)是判断一个年份是否是闰年的逻辑表达式。3、逻辑运算符和逻辑表达式3.4运算符和表达式逻辑值的真假判定──0和非0C语言用整数1表示“逻辑真”、用0表示“逻辑假”。但在判断一个数据的“真”或“假”时,却以0和非0为根据:如果为0,则判定为“逻辑假”;如果为非0,则判定为“逻辑真”。例如假设n=12,则!n的值=0,n>=1&&n<=31的值=1,n||n>31的值=1。说明(1)逻辑运算符两侧的操作数,除可以是0和非0的整数外,也可以是其它任何类型的数据,如实型、字符型等。3、逻辑运算符和逻辑表达式3.4运算符和表达式
(2)一旦“&&”和“||”能够确定表达式的值,则不再继续运算,即并不是所有的表达式都被运算。①对于逻辑与运算,如果第一个操作数被判定为“假”,系统不再判定或求解第二操作数。②对于逻辑或运算,如果第一个操作数被判定为“真”,系统不再判定或求解第二操作数。例如假设n1、n2、n3、n4、x、y的值分别为1、2、3、4、1、1,则求解表达式(x=n1>n2)&&(y=n3>n4)后,x的值变为0,而y的值不变,仍等于1。3、逻辑运算符和逻辑表达式3.4运算符和表达式赋值运算符
赋值运算符分为基本赋值运算符(又称赋值运算符)、复合赋值运算符(+=、-=、*=、/=、%=、&=、^=、|=、<<=、>>=)。基本赋值运算符
基本赋值运算符即赋值运算符“=”,它是双目运算符,赋值运算符的左边必须是变量,右边是表达式,其作用是将一个表达式的值赋给一个变量。
例如,x=5
y=(float)5/2如果表达式值的类型,与被赋值变量的类型不一致,但都是数值型或字符型时,系统自动地将表达式的值转换成被赋值变量的数据类型,然后再赋值给变量。
4、赋值运算符和赋值表达式3.4运算符和表达式复合赋值运算复合赋值运算符由赋值运算符之前再加一个双目运算符构成。格式
变量双目运算符=表达式
└─┬─┘
复合赋值运算符等价于
变量=变量双目运算符(表达式)。
当表达式为简单表达式时,表达式外的一对圆括号才可缺省,否则可能出错。例如,x+=3 /*等价于x=x+3*/y*=x+6 /*等价于y=y*(x+6),而不是y=y*x+6*/C语言规定的10种复合赋值运算符如下:+=,-=,*=,/=,%=; /*复合算术运算符(5个)*/&=,^=,|=,<<=,>>=; /*复合位运算符(5个)*/4、赋值运算符和赋值表达式3.4运算符和表达式优先级和结合性(1)算术运算符优先于关系运算符优先于双目逻辑运算符优先于复合赋值运算符;(2)复合赋值运算符和赋值运算符的优先级相同,结合性是从右至左。赋值表达式由赋值运算符或复合赋值运算符,将一个变量和一个表达式连接起来的表达式,称为赋值表达式。格式变量=表达式变量复合赋值运算符表达式4、赋值运算符和赋值表达式3.4运算符和表达式又称顺序求值运算符,所连接起来的式子称为逗号表达式。格式
表达式1,表达式2,……,表达式n求解过程自左向右,依次计算各表达式的值,“表达式n”的值即为整个逗号表达式的值。例如逗号表达式a=3*5,a*4的值=60,即先求解a=3*5,得a=15;再求a*4=60,所以逗号表达式的值是60。又如逗号表达式(a=3*5,a*4),a+5的值=20,即先求解a=3*5,得a=15;再求a*4=60;最后求解a+5=20,所以逗号表达式的值是20。注意:并不是任何地方出现的逗号,都是逗号运算符。很多情况下,逗号仅用作分隔符。5、逗号运算符和逗号表达式3.4运算符和表达式格式表达式1?表达式2:表达式3条件表达式中的表达式1、表达式2、表达式3的类型可以各不相同。运算规则如果“表达式1”的值为非0(即逻辑真),则运算结果等于“表达式2”的值;否则,运算结果等于“表达式3”的值。优先级与结合性条件运算符的优先级,高于赋值运算符,但低于关系运算符和算术运算符。其结合性为从右到左(即右结合性)。
6、条件运算符和条件表达式3.4运算符和表达式【例3-3】从键盘上输入一个字符,如果是大写字母,则将其转换成小写字母输出;否则,直接输出。#include<stdio.h>intmain(void){charch;
printf("Inputacharacter:");
scanf("%c",&ch);
ch=(ch>='A'&&ch<='Z')?(ch+32):ch;
printf("ch=%c\n",ch); return0;}
6、条件运算符和条件表达式3.4运算符和表达式为了为了节省内存空间,在系统中常将多个标志状态简单地组合在一起,存储到一个字节(或字)中。C语言提供了将标志状态从标志字节中分离出来的位运算功能。位运算是按二进制位进行的运算,运算对象只能是整型(包括字符型)数据,运算结果仍为整型。位运算符分为位逻辑运算符和位移位运算符。位逻辑运算符位逻辑运算符将数据中的每个二进制位上的“0”或“1”作为逻辑值,按位进行逻辑运算。位逻辑运算符分为按位非、按位与、按位或和按位异或(又称按位加)四种。优先级和结合性(1)~优先于算术运算符优先于关系运算符优先于&优先于^优先于|优先于双目逻辑运算符;(2)~与单目的逻辑运算符、自增、自减、算术、长度运算符的优先级相同,结合性是从右至左。
7、位运算符和位运算表达式3.4运算符和表达式按位与&
对应位均为1时才为1,否则为0:3&9=1。例如,3&9=1:0011&1001 ──── 0001=1
其作用是取(或保留)1个数的某(些)位,其余各位置0。
按位或|
对应位均为0时才为0,否则为1:3|9=11。例如,3|9=11:0011 |1001──── 1011=11
其作用是将1个数的某(些)位置1,其余各位不变。
7、位运算符和位运算表达式3.4运算符和表达式(3)按位异或^对应位相同时为0,不同时为1:3^9=10。其作用是使1个数的某(些)位翻转(即原来为1的位变为0,为0的变为1),其余各位不变。(4)按位取反~各位翻转,即原来为1的位变成0,原来为0的位变成1:在IBM-PC机中,~0=0xffff,~9=0xfff6。其作用是间接地构造一个数,以增强程序的可移植性。位移位运算符位移位运算符是将数据作为二进制数,进行向左或向右移动若干位的运算,分为左移(<<)和右移(>>)两种,均为双目运算符,其中第一个运算对象是移位对象,第二个运算对象是移动的二进制位数。移位规则优先级和结合性(1)算术运算符优先于位移位运算符优先于关系运算符;(2)位移位运算符的优先级相同,结合性是从左至右。无符号数左移舍去←←←…←←
←0补入无符号数右移补入0→→→…→→→舍去
有符号数左移舍去←←←…←←
←0补入
有符号数右移
→→…→→→舍去
格式长度运算符是单目运算符,其运算对象可以是任何数据类型符或变量。sizeof(数据类型符)或sizeof(变量)优先级和结合性(1)与单目算术运算符、单目逻辑运算符、自增和自减运算符的优先级相同。(2)上述相同优先级的运算符的结合性是从右至左。8、长度运算符3.4运算符和表达式自动类型转换参与运算的各个数据都转换成数据长度较长的数据类型,然后计算,结果的类型就是数据长度较长的数据类型。本质上是较低类型向较高类型的转换,即“就高不就低”或“就长不就短”的原则。
说明(1)横向向左的箭头,表示必须的转换。char和short型必须转换成int型,float型必须转换成double型。(2)纵向向上的箭头,表示不同类型的转换方向。例如int型与double型数据进行混合运算,则先将int型数据转换成double型,然后在两个同类型的数据间进行运算,结果为double型。注意:箭头方向只表示数据类型由低向高转换,不要理解为int型先转换成unsigned型,再转换成long型,最后转换成double型。3.5数据类型转换赋值类型转换先将运算结果的数据类型自动转换为左边变量的数据类型,然后再赋予该变量。本质上是“就左不就右”的转换规则。例如运算结果为单精度实型,而要赋值的变量是双精度实型,则先将运算结果自动转换为双精度实型,然后再赋予双精度实型的变量。
例如,int
a=1;floatb=2.1;charc='a';则表达式a=b+c的计算过程是先计算b+c,按照“就高不就低”的规则,将c转换为实型(字符c的值是97,转换后为97.0),计算结果是实型,即99.1,由于变量a是整型,按照“就左不就右”的规则,所以将实型自动转换为整型赋予变量a,即99赋值给变量a。3.5数据类型转换强制类型转换除自动转换外,C语言也允许强制转换。一般格式为:
(数据类型)(表达式)C语言首先按照自动类型转换原则计算表达式的值,然后将其转换为指定的数据类型。需要注意的是,若表达式仅仅是单个常量或变量时,外面的一对圆括号可以缺省;若是含有运算符的表达式,则必须用一对圆括号括起来。(double)a/*等价于(double)(a),将变量a的值转换成double型*/(int)(x+y)
/*将x+y的结果转换成int型*/(float)5/2/*等价于(float)(5)/2,将5转换成实型,再除以2(=2.5)*/(float)(5/2)
/*将5整除2的结果,(2)转换成实型(2.0)*/注意:强制转换类型得到的是一个所需类型的中间量,原表达式类型并不发生变化。例如(double)a只是将变量a的值转换成一个double型的中间量,其数据类型并未转换成double型。3.5数据类型转换ThankYou!第4章结构化程序设计4.1结构化程序设计方法结构化程序三种基本结构4.2顺序结构程序设计4.34.4选择结构程序设计4.5循环结构程序设计本章内容导读本章主要介绍结构化程序设计方法以及与三种基本结构相关的语句。通过学习本章,读者应掌握以下内容:了解结构化程序的三种基本结构;掌握字符和格式输入/输出函数的调用格式和功能;掌握单、双和多分支选择语句的格式和功能;掌握while语句、do-while语句、for语句、break语句和continue语句的格式和功能。结构化程序设计(StructuredProgramming)以模块功能和处理过程设计为主的详细设计的基本原则。1965年由E.W.Dijkstra
提出。基本思路把一个复杂问题的求解过程分阶段进行,每一阶段处理的问题都控制在人们容易理解和处理的范围内。具体方法自顶向下,逐步求精模块化设计结构化编码4.1结构化程序设计方法一、顺序结构二、选择结构三、
循环结构4.2结构化程序三种基本结构
顺序结构是按书写顺序依次执行语句操作。1、顺序结构4.2结构化程序三种基本结构单分支选择结构仅包含一个条件,其功能是根据条件是否成立,决定是否执行某个操作。
注:表达式可以是任意表达式,若“非0”则执行操作。
操作条件否是2、选择结构4.2结构化程序三种基本结构双分支选择结构
仅包含一个条件,其功能是根据条件是否成立,决定从两个操作中选取一个操作执行。操作1操作2条件是否2、选择结构4.2结构化程序三种基本结构多分支选择结构
包含n(n>1)个条件,其功能是根据某个条件是否成立,从n+1个操作中选取一个操作执行。表达式1否操作2是操作1表达式2否表达式n否操作n+1操作n
是是2、选择结构4.2结构化程序三种基本结构
当型循环结构直到型循环结构次数型循环结构3、循环结构4.2结构化程序三种基本结构顺序结构的程序组成(1)程序开头的编译预处理命令。
程序中要使用的库函数(又称系统函数),除了printf()和scanf()函数外,其它的都必须使用编译预处理命令将相应的头文件包含进来。(2)顺序结构的程序由完成具体功能的各个语句和运算组成。主要包括:变量类型的说明提供数据的语句运算部分输出部分4.3顺序结构程序设计格式一变量=表达式;功能:计算表达式的值,然后赋予变量。格式二变量复合赋值运算符表达式;功能:将变量和表达式进行指定的算术或位运算后,再将运算结果赋予变量。C语言中事先编好的函数(称为库函数或系统函数)或用户自定义函数(用户函数)都是通过函数调用实现其功能的,并获得函数的返回值。格式函数名(参数1,参数2,…,参数n);
功能:调用指定的库函数或用户自定义函数,对圆括号中的参数进行该函数指定的运算,运算结果作为函数的返回值返回。1、赋值语句2、函数调用语句4.3顺序结构程序设计格式表达式;功能:计算表达式的值。格式
{语句1;语句2;…语句n;
}功能:依次执行语句1,语句2,…,语句n。说明(1)复合语句可以包含多条语句,但整体上是作为一条语句看待。(2)复合语句中若有数据定义语句,则应放在复合语句中其它语句的前面。3、表达式语句4、复合语句4.3顺序结构程序设计C语言中的输入和输出操作,均是利用C语言编译系统提供的库函数实现的,C语言本身并没有提供这两类语句。
字符输出函数putchar()调用格式:putchar(ch)功能:把一个字符输出到标准输出设备(显示器)。
参数:ch可以是一个整型变量、字符型变量、整型常量或字符型常量,也可以是一个转义字符或整型表达式,但不能是字符串。
返回值:输出ch对应的单个字符。
说明:源程序(文件)开头需要加入编译预处理命令#include<stdio.h>或#include"stdio.h"。5、字符输入/输出函数4.3顺序结构程序设计
字符输入函数getchar()
调用格式:getchar()功能:从标准输入设备(键盘)上读入一个字符。
参数:无参数。
返回值:输入的单个字符。
说明(1)getchar()函数只能用于单个字符的输入,一次输入一个字符。输入的数字也是按字符处理。当输入多于一个字符时,只接收第一个字符。(2)getchar()函数输入的字符可以赋给一个字符变量或整型变量,也可以不赋给任何变量,而作为表达式的一部分。(3)源程序(文件)开头需要加入编译预处理命令#include<stdio.h>或#include"stdio.h"。5、字符输入/输出函数4.3顺序结构程序设计格式输出函数printf()调用格式:printf(格式控制字符串,输出项表)功能:按照用户指定的格式把指定的数据显示到标准输出设备(显示器)。
说明(1)格式说明符与输出项一一对应,若格式说明符的个数少于输出项个数时,则多余的输出项不输出;若格式说明符的个数多于输出项个数时,则对缺少的项输出不确定值。(2)不需要编译预处理命令。格式输入函数scanf()调用格式:scanf(格式控制字符串,输入项首地址表)功能:从键盘按照“格式控制字符串”中规定的格式读取若干个数据,然后按照“输入项首地址表”中的顺序,依次将数据存入相应的变量。
说明:不需要编译预处理命令。6、格式输入/输出函数4.3顺序结构程序设计printf(格式控制字符串,输出项表)普通字符(原样输出)格式说明符
%+/-0m.nl格式字符正号左对齐域宽左补0当输出实型数据时,表示输出n位小数;当输出字符串时,表示截取前n个字符输出。在格式字符d、o、x和u之前输出长整型数据;在格式字符e、f、g之前输出双精度实型数据。d:以有符号的十进制整数形式输出;o:以八进制无符号形式输出整型数;X或x:以十六进制无符号形式输出整型数;c:输出一个字符(只占一列宽度);s:输出字符串;f:以小数形式、按系统默认的宽度,输出单精度和双精度实数。
scanf(格式控制字符串,输入项首地址表)普通字符(原样输入)格式说明符
%mhl*格式字符域宽输入短整型数据,可用在格式字符d、i、o、x之前。表示本输入项在读入后不赋予相应的变量。在格式字符d、o、x和u之前输入长整型数据;在格式字符e、f、g之前输入双精度实型数据。d:以十进制有符号形式输入整型数据;o:以八进制无符号形式输入整型数据;X或x:以十六进制无符号形式输入整型数据;c:输入一个字符;s:将一个字符串输入到字符数组;f、e:输入实型数据。注意①如果相邻两个格式字符之间,没有指定数据分隔符(如逗号、冒号等),则相应的两个输入数据之间,至少用一个空格分开,或者用Tab键分开,或者输入一个数据后按回车,然后再输入下一个数据。例如int
num1,num2;
scanf("%d%d",&num1,&num2);若num1输入12,num2输入36,则正确的输入操作如下:12□36←┘或者12←┘36←┘②输入实数时不能规定精度。例如,floatx;
scanf("%7.2f",&x);是错误的。
注意③格式控制字符串”中出现的普通字符(包括转义字符),务必原样输入。例如int
num1,num2;scanf("%d,%d",&num1,&num2);若num1输入12,num2输入36,则正确的输入操作如下:12,36←┘
&变量名④在以%d、%f、%lf、%e输入数值型数据时,遇到以下情况,系统认为数据输入结束。遇到空格或回车键或者Tab键输入结束,可用它们作为数据之间的分隔符。遇到宽度结束。例如“%3d”,只取3列,即系统自动按域宽截取所需数据。遇到输入数据与格式说明符类型不一致,则输入结束。遇到非法输入结束。例如在输入数值型数据时,遇到字母等非数值符号(数值符号仅由数字字符0~9、小数点和正、负号构成)。注意⑤在“格式控制字符串”中除了格式字符外还有其它字符,则在输入数据时应输入与这些字符相同的字符。例如int
x,y;scanf("%d,%d",&x,&y);则正确的输入操作如下:1,2←┘⑥以“%c”输入单个字符时,空格、回车键和转义字符均作为有效字符输入,因此输入的数据之间不需要分隔符。例如charch1,ch2,ch3;
scanf("%c%c%c",&ch1,&ch2,&ch3);若从键盘输入A□B□C←┘则将'A'赋值给ch1,空格'□'赋值给ch2,'B'赋值给ch3。正确的输入是连续输入3个字符,中间不加空格,即:xyz←┘单分支选择语句格式if(表达式)语句;功能:计算表达式的值,若为“真”(非0),则执行语句;否则不执行语句。
注:表达式可以是任意表达式,语句可以是任何语句(除了数据定义语句),也可以是另一个if语句(称为嵌套的if语句,后面将介绍)。语句表达式0非04.4选择结构程序设计if-else语句(双分支选择语句)格式if(表达式)语句1;
else语句2;功能:计算表达式的值,若为“真”(非0),则执行语句1;否则执行语句2。语句1语句2表达式非004.4选择结构程序设计【例4-1】输入一个整数,判断奇偶。#include<stdio.h>intmain(void){
intn;
printf("Inputanumber\n");
scanf("%d",&n);
if(n%2==0)
printf("Thenumberiseven\n");
else
printf("Thenumberisodd\n");return0;}
Inputanumber
100ThenumberisevenInputanumber25Thenumberisodd例
if
(n>0)
if(a>b)c=a;
elsec=b;if语句允许嵌套,在if语句中包括一个或多个if语句。if语句的嵌套(分支嵌套的一般形式)这种嵌套是在if-else语句的任一分支上嵌套单分支的if选择结构或双分支的if选择结构。注:else总是与前面最近的并且没有与其他else匹配的if相匹配。例
if(n>0){if(a>b)c=a;}
elsec=b;
4.4选择结构程序设计【例4-2】求一个点所在的象限。#include<stdio.h>intmain(void){ floatx,y;
printf("Inputthecoordinateofapoint\n");
printf("x=");
scanf("%f",&x);
printf("y=");
scanf("%f",&y);
if(x>0)
if(y>0)printf("Thepointisin1stquadrant.\n");elseprintf("Thepointisin4thquadrant.\n");else
if(y>0)printf("Thepointisin2ndquadrant.\n");elseprintf("Thepointisin3rdquadrant.\n");return0;}
Inputthecoordinateofapointx=5y=3Thepointisin1stquadrant.Inputthecoordinateofapointx=-2y=-7Thepointisin3rdquadrant.
if-else-if语句的嵌套(分支嵌套的特殊形式)这种嵌套是在每一层else分支下嵌套一个if-else语句。if(表达式1)语句1Elseif(表达式2)语句2
elseif(表达式3)语句3
……
elseif(表达式n)语句n
else语句n+1表达式1假(0)语句2真(非0)语句1表达式2假(0)表达式n假(0)语句n+1语句n真(非0)真(非0)4.4选择结构程序设计switch-case语句(多分支选择语句)格式switch(表达式){case常量表达式1:
语句组1
break;
case常量表达式2:
语句组2
break;
……case常量表达式n:
语句组nbreak;
default:
语句组n+1}表达式语句组1语句组2语句组n语句组n+1=常量表达式1=常量表达式2=常量表达式n=default…………breakbreakbreak说明(1)每个case后面的“常量表达式”的值,必须各不相同,否则会出现相互矛盾的现象(即对表达式的同一值,有两种或两种以上的操作)。(2)case后面的“常量表达式”仅起到语句标号的作用,并不进行条件判断。系统一旦找到入口标号,即从此标号开始执行,不再进行标号判断,所以必须加上break语句,以便结束switch语句。(3)程序的执行结果与各case和default子句的先后次序无关。(4)多个case子句,可共用同一个语句(组)。(5)switch语句实现的多分支选择结构,完全可以用if语句或if语句的嵌套来实现。(6)break语句是C语言的一种语句,其功能是中断正在执行的语句,将在本章第五节介绍。在switch语句中它的作用是执行完某一语句(组)后,退出该switch语句,无条件转至switch语句的下一条语句。若省略break语句,则执行完某一语句(组)后,将继续执行switch语句中其后的所有语句(组)。(7)default及其后面的语句(组)可以省略。省略时,若表达式的值和n个常量表达式的值均不同,则不执行任何操作就退出该switch语句。(8)语句组不需要用一对花括号{}括起来。(9)switch语句允许嵌套。【例4-3】switch语句嵌套的实例。#include<stdio.h>intmain(void){
intx=1,y=0,a=0,b=0;
switch(x){case1:switch(y){case0:a++;break;case1:b++;break;}case2:a++;b++;break;case3:a++;b++;}
printf("a=%d,b=%d\n",a,b);return0;}
a=2,b=1例如,计算1-100的累计和。根据已有的知识,可以用1+2+……+100求解,但显然很繁琐。现在换个思路来考虑:首先设置一个累计器sum,其初值为0,利用sum+=n计算(n依次取1、2、……、100),只要解决以下3个问题即可:将n的初值置为1;每执行1次sum+=n后,n增1;
当n增到101时,停止计算。此时,sum的值就是1至100的累计和。
根据已有的知识,单独实现每一步都不难。但是,由于需要经常使用这种重复计算结构(称为循环结构),C语言提供了当型循环结构、直到型循环结构和次数型循环三种循环结构实现。提供了while、do-while和for三种循环语句实现上述三种循环结构。4.5循环结构程序设计格式
while(表达式)语句;功能:计算表达式的值,当其值为“真”(非0),则执行语句;重复执行上述操作,直至表达式的值为“假”(0)时为止。说明(1)语句又称为“循环体”,可以是任何语句(除了数据定义语句外),通常是复合语句。(2)表达式称为“循环控制条件”,可以是任何类型的表达式,常用关系型或逻辑型表达式。(3)先判断,后执行循环体,即表达式不成立时,循环体最少执行0次;(4)当循环体内无改变表达式的语句(如
i++)时,while(1)是死循环。(5)若循环体中又含有“循环语句”,则称为循环的嵌套,即多重循环。while表达式语句0非01、while语句4.5循环结构程序设计格式
do语句;
while(表达式);功能(1)执行语句;(2)计算表达式,如果其值为“真”(非0),则转至(1)继续循环;否则,转至(3);(3)执行do-while语句的下一条语句。说明(1)先执行循环体,后判断。无论表达式成立不成立,循环体最少执行1次。(2)
do-while语句能够实现的功能for语句也能实现,而且更简洁。do表达式语句0非02、do-while语句4.5循环结构程序设计格式for(表达式1;表达式2;表达式3)语句;说明①表达式1的作用变量赋初值;表达式2的作用是控制循环的条件;表达式3的作用是循环后修正变量,使循环趋向结束。②表达式1可以是任何类型,其后面有一个分号,表达式1可以省略
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 铝模板清理保养施工工艺
- 2026年江苏省仪征市高三数学下册期末考试模拟检测卷及答案【网校专用】
- 内容创作者业绩绩效评定表
- 连锁餐饮品牌总部运营支持指南区域管理方案
- 广告行业策划项目经理绩效评价表
- 影视制作公司制片人影片制作成本与效益分析绩效衡量表
- 与否决采购新系统申请结果及理由回复函(6篇)范文
- 销售管理部客户续约提前终止确认函6篇
- 通信公司5G研发团队负责人绩效衡量表
- 茶餐厅顾客满意度调查指南
- 新22G05 钢筋混凝土楼梯
- 2026医院收费员考试题库及参考答案
- 冀教版(2026新教材)初中信息科技八年级全一册(全册)教案(附目录)
- 预制小箱梁(T梁)安装施工组织设计
- 2026年南阳市县以下事业单位公开招聘联考笔试笔试题库【典优】附答案详解
- 完全平方公式:从几何直观到代数推理-初中七年级数学教学设计
- GB/T 32363.2-2026塑料聚酰胺(PA)模塑和挤出材料第2部分:试样制备和性能测定
- 梨子的栽培技术与管理
- JJF(蒙) 156-2026 机动车检验用内窥镜校准规范
- 爱粮始于心 节粮践于行2026年世界粮食日主题班会
- 产后产后恢复误区解读
评论
0/150
提交评论