C语言数据类型和玉那算规则课件_第1页
C语言数据类型和玉那算规则课件_第2页
C语言数据类型和玉那算规则课件_第3页
C语言数据类型和玉那算规则课件_第4页
C语言数据类型和玉那算规则课件_第5页
已阅读5页,还剩193页未读 继续免费阅读

下载本文档

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

文档简介

C语言程序设计教程主讲:邓宏彬北京理工大学计算机学院C语言程序设计教程主讲:邓宏彬1复习基本概念什么是算法,如何设计算法?算法的两要素:基本功能操作控制结构常用算法枚举法、迭代法、递推法、递归法算法的特点有穷性、确定性、有效性、I/O算法的表示流程图复习基本概念2C语言的发展历程C语言的特点C程序的结构规则函数的基本单元、main函数等标准库函数C语言的关键字(32个)C语言的上机执行过程C语言的发展历程3第三章数据类型与运算规则本章要点:数据与数据类型基本数据类型及其表示算术运算与赋值运算关系运算与逻辑运算位运算其它运算混合运算及数据类型转换第三章数据类型与运算规则本章要点:43.1数据与数据类型数据是程序加工、处理的对象,也是加工的结果。具有同样性质的数据可被分成一些集合,程序能对它们进行同样的操作、或采用同样的编码等,这样的集合称为数据类型。所有的程序语言都是用数据类型来描述程序中的数据结构、数据表示范围、数据在内存中的存储分配等。数据类型是计算机科学的核心概念之一。3.1数据与数据类型数据是程序加工、处理的对象,也是加5常数变量运算符表达式函数??

把自然语言描述问题的方式转换为C语言的形式表达给计算机规则表达式常数变量函数运算符算例常数??把自然语言描述问题的方式转换为C语言的形式表6常数3、5和3.6的存放空间是否相同?变量a如何表示?如何存放?计算机如何知道3.6和a之间的关系?和

如何输入?如何存放?计算机如何识别“=”?运算结果放在哪里?数据的描述数据的操作程序类型运算符计算机完成上述计算,首先要解决数据的输入和存放问题常数3、5和3.6的存放空间是否相同?数据的描述程序类型运7程序的任务是对数据进行处理,数据是程序处理的对象,而运算符是施加给这些数据的操作。数据和运算符是表达式的基本元素程序的任务是对数据进行处理,数据是程序处理的对象,而运算符是8C语言的数据类型数据类型构造类型指针类型空类型(无值类型)void枚举类型enum数组类型结构类型struct联合类型union基本类型整型int字符型char实数型(浮点型)单精度实型float双精度实型doubleC语言的数据类型数据类型构造类型指针类型空类型(无值类型)93.2C语言基本数据类型及其表示

3.2.1常量与变量常量:在程序运行过程中,其值不能改变的数据称为常量。常量可以分为直接常量和符号常量,直接常量包括整型常量、实型常量、字符常量和字符串常量,如12,4.6,‘a’,“CHINA”等。符号常量是指用一个指定的标识符代表某个常量,在程序中需要使用该常量时就可以直接引用标识符。C语言中用宏定义命令对符号常量进行定义,其定义形式为:#define标识符常量#definePAI3.1415926常量并不占内存,在程序运行时直接调入寄存器中。3.2C语言基本数据类型及其表示3.2.1常量与变10变量在程序运行过程中,其值可以改变的数据称为变量。变量通过变量名标识,变量名和内存中的存储单元相对应。编写程序时通过变量名来存、取存储单元。C语言是一种强制定义型语言,变量必须先定义,后使用,定义时必须提供变量的名字和类型。变量可以分为数值变量、字符变量和指针变量。其中数值变量包括整型变量和实型变量。变量memorya825612变量变量memorya82561211变量名由字母A、B、…、Z、a、b、…、z,数字0、1、…、9和下划线_组成。变量名的第一个字符必须是英文字母或下横线。不能用系统中的关键字作为变量名变量名中的字母是区分大小写的。sum、stu_name、_age、Lts_1_2、a232c、x.y、start+9、c2.0NAMEname表示两个不同的标识符。养成良好的命名习惯变量名的规定变量名由字母A、B、…、Z、a、b、…、z,数字0、112●变量必须先定义后使用如:inta,b;a=10;b=a*12;c=a+b;×

15

1000K变量的3个属性:变量地址变量内容

变量名●变量必须先定义后使用×151000K变量的133.2.2整型数据整型常量整型常量的类型根据值大小默认类型在常量后面加l或L,表示longint型例如:123L,0L,432l都是longint型常量整型数据包括整型常量和整型变量,

整型数据以二进制补码形式存储

整型常量的不同数值表示方法 10进制:0~9 8进制:0~7,以0开头 16进制:0~9,A~F/a~f,以0x或0X开头

100、-8、0;010、024;0x38、0X1F3.2.2整型数据整型常量整型数据包括整型常量和整型变量14

数据在计算机内存中是以二进制数形式存放的。实际上,在计算机当中数据是以补码的形式存储的。正数的补码是它本身,负数的补码是其绝对值取反加1。例如-10原码1000000000001010绝对值0000000000001010取反1111111111110101加11111111111110110—>-10数据在计算机内存中是以二进制数形式存放的。15共六种基本整型短整型长整型无符号整型无符号短整型无符号长整型intshortintlongintunsignedintunsignedshortunsignedlong占存储空间占内存字节数224224字节?整型变量共六种基本整型int占存储空间占内存字节数2字节?整型变量16例如:inti,j;longk,m;

unsignedintx,y;变量有值吗?C中的所有变量必须先定义后使用!!格式:类型说明符变量列表;!整型变量的定义例如:inti,j;变量有值吗?C中的所有变量必须先17整型变量的分类数据类型占用字节二进制位取值范围int216-32768~32767(-215~215-1

)short216-32768~32767long432-2147483648~2147483647signed216-32768~32767signedshort216-32768~32767signedlong432-2147483648~2147483647unsigned2160~65535unsignedshort2160~65535unsignedlong4320~4294967295(0~232-1)整型变量的分类数据类型占用字节二进制位取值范围int216180000000000000001000000000000001101111111111111111000000000000000=1=3最大的负数?=-215=-32768

定点二进制补码表示占2个字节存储数的表示范围:-32768~32767最高位“1”表负数,“0”表正数?-215

的补码a=215-1=32767最大的正数?int型数的表示范围:0000000000193.2.3实型数据C语言中实数和实型变量可分为三种类型:单精度型(float,4字节)双精度型(double型,8字节)长双精度型(longdouble,16字节)。单精度实型数据的有效数字是7位,双精度实型数据的有效数字是16位,长双精度实型数据的有效数字是19位。3.2.3实型数据C语言中实数和实型变量可分为三种类型20名称 存储字节 表示范围 说明方法有效位单精度(尾加F)

4 -1038--1038 floata; 7双精度(尾不加)

8 -10308--10308 doublea; 16长双精度(尾加L)

16 -104932-104932 long

doublea;192.实型变量011111110111111111111111111111111-2-23≈127-1=1272127≈1038与课本46页对比!名称 存储字节 表示范围 说明方法21数的范围数的取值范围是指数的绝对值有效位数据在计算机中存储和输出时能够精确表示的数字位数

二进制7位

二进制23位单精度实型尾数阶码阶符数符数的范围二进制7位二进制23位单精度实型尾数阶码阶符22实型常量的表示方法1.小数形式(至少有一个小数点和一个数字)0.12,.12,12.0,12.2.指数形式(e前有数字,e后有整数)1.34510-21.345e-2

尾数指数

1.2e3,12e-2,e21.2e3e1.2×××实型常量的表示方法1.小数形式2.指数形式尾数指数23?实型数的分辨率:最小正数:10-38小于该数时处理为0下溢最大正数:1038大于该数时提示出错上溢实型数在计算机内部都按指数形式存放实型数常数一般都作为双精度数处理

数的存储结构和精度与计算机硬件特性有关!超出表示范围的数机器如何处理??实型数的分辨率:实型数在计算机内部都按指数形式存放24

main(){floata,b;a=0.123e40;b=0.123e-40;c=12345.6789;printf("a=%e,b=%e\n",a,b);printf("%f\n",1.234);printf("%f\n",c);

printf("%f\n",1111111111.2222222222f+1111111111.2222222222f);printf("%f\n",1.123456789);getch();}

20位上溢下溢为06位小数16位有效数7位有效数6位小数main()20位上溢下溢为06位小数16位有效数7253.2.4字符型数据将一个字符常量放到一个字符变量中,实际上并不是将该字符本身放到相应变量的内存单元中,而是将该字符的相应的ASCII码放到相应的存储单元中。字符型数据包括字符型常量和字符型变量。字符型常量又被称为字符常数。C语言中字符型常量是用单引号括起来的一个字符,如‘a’,‘A’。由于C语言对字母的大小写是敏感的,因此‘a’和‘A’是不同的字符型常量。3.2.4字符型数据将一个字符常量放到一个字符变量中,实26字符型常量在此有两点需要注意:字符型常量使用单引号作为标识。字符型常量只能包含一个字符。例‘a’,’A’,‘1’‘abc’、“a”字符型常量在此有两点需要注意:例‘a’,’A’,‘1’27定义形式char占存储空间一个变量1字节一个字符变量只能包含一个字符例Main(){charc;c=‘c’;printf(“%c”,c);}运行结果:c?题目中有几个c,哪些是等价的?字符型变量定义形式char一个变量1字节一个字符变量只能包含一28‘a’的ASCII值为97

内存中存储形式01100001在ASCII范围以内,整型数据!字符型数据的存储格式:ASCII码字符‘a’、’A’、‘1’

存储为:97、65、49例‘a’的ASCII值为970110000129字符串常量字符串常量是用双引号括起来的一个或多个字符。n个字符组成的字符串常量,在内存中占空间为n+1个字节china\0字符串结束标记“空”字符“a” 串长1“ThisisCstring”串长16

“”(空格) 串长1

“”(不含空格) 串长0例C中没有专用的字符串变量!字符串常量字符串常量是用双引号括起来的一个或多个字符。n个字30对于不可显示字符,C语言提供的另一种字符型常量是转义字符常量。转义字符常量是以“\”开头的字符常量,它通知编译器需要用特殊的方式处理“\”后的字符,将“\”后的字符转换成另外的意义。\n换行\t水平跳格\b退格\r回车\f走纸换页\\反斜杠\’单引号字符\”双引号字符\dddddd表示1到3位八进制数字\xhhhh表示1到2位十六进制数字对于不可显示字符,C语言提供的另一种字符型常量是转义字符常量31例:‘\60’是十进制数48,代表ASCII码字符0‘\105’是十进制数69,代表ASCII码字符E‘\015’是十进制数13,代表ASCII码字符回车‘\x1f’是十进制数31,代表ASCII码字符▼‘\x61’是十进制数97,代表ASCII码字符a例:32main(){chara,b,c;intd;a='\5';b='\60';c=’A';d=1089;printf("a=%cb=%cc=%dd=%c\n",a,b,c,d);printf(“a=%db=%d\n",a,b);getch();}按整数输出C按字符输出D00000100

01000001d6500110000b=‘\60‘在计算机中的存储按字符和整数输出amain()按整数输出C按字符输出D00000133思考:*

字符串

“w\11”占几个字节?转义字符字符串结束标记

w\11*

字符串“w\11\0good”占几个字节?3字节思考:*字符串“w\11”占几个字节?转义字符字符串结34指针型数据及其表示C语言定义了一种新的数据类型——指针类型,它是一个变量在内存中所对应的存储单元的地址。用来存放指针的变量称为指针变量。高级语言中的变量具有三个属性变量名变量的值变量的地址指针型数据及其表示C语言定义了一种新的数据类型——指针类型35访问内存的两种方式:直接访问:按地址直接存取&a间接访问:通过指针p间接存取100010061002102310abc3.551000p对于inta=10,c=5;floatb=3.5;内存分配例a的地址存储变量2字节a的内容指针a的地址a是整型变量,存放内容p是指针变量,存放地址a的地址指向a访问内存的两种方式:100010061002102310a36*指针运算符&取地址运算符。例如:inta;int*p;则&a为变量a的地址,*p为指针变量p所指向的存储单元所存储的内容。*指针运算符37例:inta=10,*p,x;floatb=3.5,*p1;charc,*p2=&c;p=&a;p1=&b;x=*p;*p=a定义:类型说明符*指针变量名*p是p指向的变量a指针运算*p*p定义指针变量指针初始化指针赋值指针变量的定义与赋值类型说明符用来指定该指针变量指向的变量的类型,而并非指针的类型。C语言允许指针指向任何类型的对象,包括别的指针。例:inta=10,*p,x;*p=a定义:类型说明符38*--指针运算符&--取地址运算符同级,右结合指针变量的赋值inta=3,*p,*p1,*p2,*p3,p4;p=&a;/*取a地址运算*/p1=p;/*直接赋值*/p2=MULL;/*赋空值,不指向任何变量*/P3=0;p4=‘\0’;指针变量的操作

inta=3,*p,*p1,k;p=&a;/*a地址P*/k=*P;

/*3k*/*p=20;/*20a*/*&a=30;/*先取a的地址,再按地址赋值30a*/p1=&*p;

/*因为&*p=&a,操作结果使p1指向a*/*--指针运算符指针变量的赋值inta=3,*p,*p1,39问题1:int*i;float*p1;指针变量i中只能指向整型变量?指针变量p1中只能指向实型变量?问题2:指针变量能指向常数吗?讨论!指针的应用在第十章介绍问题1:int*i;float*p1;问题2:指针变40变量初始化C语言允许变量初始化具有两种形式:一种是先声明后赋值,另一种是在定义变量的同时对该变量进行初始化。inta=3;inta,b,c=5;初始化不是在编译时进行(外部变量和静态变量除外),而是在程序运行时完成的。变量初始化C语言允许变量初始化具有两种形式:一种是先声明后413.3算术运算和赋值运算运算符是用于描述对数据进行运算的特殊符号。C语言的运算符按其在表达式中与运算对象的关系可以分为:单目运算符双目运算符三目运算符。3.3算术运算和赋值运算运算符是用于描述对数据进行运算42运算分量对数据进行运算的符号被加工的数据+表达式运算符X=5+b*cC语言中的运算符和表达式表达式的运算结果称为表达式的值运算分量对数据进行被加工+表达式运算符X=5+43学习运算符应掌握的要点运算符的种类与功能运算符与运算分量的关系个数类型A+B(a>b)?a:b目关系不同类型的变量,所占存储空间、数的表示范围、有效位和允许的操作不同单目运算双目运算三目运算学习运算符应掌握的要点运算符的种类与功能个数类型A+B44按照运算符在表达式中所起的作用,运算符可以分为:1算术运算符2自增自减运算符3赋值运算符与复合赋值运算符4关系运算符5逻辑运算符6位运算符7条件运算符8逗号运算符按照运算符在表达式中所起的作用,运算符可以分为:45优先级与结合性C语言中的运算符具有一般数学运算符的特性,即具有优先级和结合性:优先级是指同一个表达式中不同优先级的运算符进行计算时的先后次序。结合性是针对同一优先级的多个运算符而言的,它是指同一个表达式中相同优先级的多个运算符应遵循的运算顺序。优先级与结合性C语言中的运算符具有一般数学运算符的特46优先级:

运算符的执行顺序

结合性:相同优先级的多个运算符的运算顺序运算结果的类型X=5+8‘a’>100X=a+b*ca+b-c5>7>2a=b=5结果?自左向右自右向左整型逻辑型130参考课本:P366优先级:运算符的执行顺序结合性:相同优先级的多个运算47算术运算符与算术表达式C语言基本算术运算符包括加+、减-、乘×、除/以及求模(求余)%运算符。“+”和“-”运算符既具有单目运算符的取正值运算和取负值运算的功能,又具有双目运算的功能。作为单目运算符使用时其优先级高于双目运算符。求模运算符%的作用是求整数除法的余数,%要求两侧都应该是整型数据,%不能作用于实型数据。两个整数相除的结果是整数,如5/3的结果为1,小数部分被舍去。算术运算符与算术表达式C语言基本算术运算符包括加+483300.5000003.3333336010-11-1商-3余-110/3值是11/3值是1/2值是1./2值是10.0/3值是10/5*3值是10/(5*3)值是10%3值是9%3值是–10%3值是10%–3值是-10%–3值是3商-3余-110/3值是49自增、自减运算符自增、自减运算符既可以放在操作数之前,也可以放在操作数之后,这两种写法是有差别的。如果自增、自减运算符放在操作数前面,则在表达式引用该操作数之前,先对其作加1或减1运算。如果自增、自减运算符在操作数之后,则表达式先引用该操作数,然后再对其加1或减1运算。例如:intx=10;y=++x;printf(“%d,%d”,x,y);Output:11,11intx=10;y=x++;printf(“%d,%d”,x,y);Output:11,10自增、自减运算符自增、自减运算符既可以放在操作数之前,也可50注意:自增、自减运算符只能用于变量,而不能作用于常量或表达式,例如5++和(a+b)++都是不合法的。自增、自减运算符作为单目运算符,它的优先级高于所有双目运算符。自增、自减运算符的结合方向是“自右向左”。例如:用于++,--运算的变量只能是整型、字符型和指针型变量。注意:自增、自减运算符只能用于变量,而不能作用于常量或表达式51main(){ inta,b,s; a=5;b=5; s=a+b; printf(“%d,%d,%d\n”,a,b,s); s=a+++b; printf(“%d,%d,%d\n”,a,b,s); s=++a+b; printf(“%d,%d,%d\n”,a,b,s); s=--a+b; printf(“%d,%d,%d\n”,a,b,s); s=a--+b; printf(“%d,%d,%d\n”,a,b,s); s=a+b; printf(“%d,%d,%d\n”,a,b,s);}例main()例52s=a+b;s=a+++b;s=++a+b;s=--a+b;s=a--+b;s=a+b;

a=5,b=55+5=105+5=107+5=126+5=116+5=115+5=10abs55106

5107

51265115

5115510题目分析ss=a+b;a=5,b=55+5=153i=2;k=i+++i+++i++;i=?i=2;k=(++i)+(++i)+(++i);5i=?5自增之后再相加讨论!i=2printf("%d",(i+++i+++i++));printf("%d",(++i+++i+++i));?i=2;i=?i=2;5i=?5自增之后再相加讨论!i=2?54已知:inti=1,j=2,k;k=i+++j;C语言处理运算符(标识符)时,遵循自左向右组合的原则,两个‘+’号是一个运算符,故处理成(i++)+j。语句:k=i+++++j;编译不能通过。原因是它将前两个‘+’处理成自增,接下来又将两个‘+’号处理为自增,故不合语法。编程者可用空格或括号来表示正确的含义:k=i+++++j;(一般不要用这样的语句)。再如:printf(“\1011\n”);本意想输出A1,编译器认为‘\’后有4个数字(允许3个),故编译出错。已知:inti=1,j=2,k;k=i+55已知:i=3;1.执行printf(“%d”,i++);Output:3i的值为42.执行printf(“%d”,++i);Output:4i的值为4已知:i=3;56四.赋值运算符将一个常量或一个表达式的值赋给一个变量格式:变量名=表达式x=5y=x+10四.赋值运算符将一个常量或一个表达式的值赋给一个变量格式:57赋值运算符和赋值表达式赋值运算符构成了C语言最基本、最常用的赋值语句。C语言中赋值运算符用“=”表示,其功能是计算赋值运算符右边的表达式的值,并将计算结果赋给“=”左边的变量。在对赋值表达式求解过程中,如果赋值运算符两侧的数据的类型不一致,但都是数值型或字符型时,在赋值时要进行类型转换。赋值运算符和赋值表达式赋值运算符构成了C语言最基本、最常用58可以将一个实型赋给一个整型也可将一个整型赋给一个实型intx,x=5.3;x的值为5floaty,y=5;y的值为5.000000赋值类型转换例接受赋值的变量类型决定了运算结果的类型可以将一个实型赋给一个整型也可将一个整型赋给一个实型int59将实型数据赋给整型变量时,舍弃实数的小数部分。将整型数据赋给实型变量时,数值保持不变,但以浮点数形式存储到变量中。将一个double型数据赋给float型变量时,截取其前面7位有效数字,存放到float型变量的存储单元中。但应注意数值范围不能溢出。将一个float型数据赋给double型变量时,数值不变,有效位数扩展到16位,在内存中以64位存储。字符型数据赋给整型变量时,将字符数据放入整型变量的低8位中。此时有两种情况:对无符号型变量赋值,则将字符的8位放入整型变量的低8位,高8位补0。对有符号型变量赋值,若字符最高位为0,则整型变量的高8位补0,若字符最高位为1,则高8位全补1。这种方法称为“符号扩展”,这样做的目的是使数值保持不变。将一个int型变量赋给一个char型变量时,只将其低8位原封不动地送到char型变量中。将实型数据赋给整型变量时,舍弃实数的小数部分。60将带符号的整型数据(int型)赋给long型变量时,要进行符号扩展。将int型数据的16位送入long型变量的低16位中,如果int型数据为正数,则long型变量的高16位补0,如果int型数据为负数,则long变量的高16位补1,以保持数值不改变。若将一个long型数据赋给一个int型变量,只需将long型数据中的低16位原封不动地送到整型变量中。将unsignedint型数据赋给longint型变量时,不存在符号扩展问题,只需将高16位补0即可。将一个unsigned型数据赋给一个占字节数相同的int型变量,可将unsigned型数据原样送到int型变量中,但如果数据范围超过相应整数的表示范围,则会出现数据溢出。将无符号型数据赋给长度相同的有符号型变量时,数据原样照赋。将带符号的整型数据(int型)赋给long型变量时,要进行符61强制类型转换运算符C语言在处理两种不同数据类型的数据进行运算时,系统会自动地将两个操作数作适当的类型转换后再进行运算。这种数据类型的转换时按照系统默认的规则由低级类型向高级类型转换的。C语言规定也可以利用强制类型转换运算符将一个表达式的值转换成所需类型。强制类型转换运算符C语言在处理两种不同数据类型的数据进行运62强制类型转换运算符的一般形式为(类型名)(表达式)注意:在强制类型转换运算符中,表达式应该用括号括起来,以表示将整个表达式的值进行强制类型转换。例如(int)x+y;则只表示将x转换成整型,然后与y相加。强制类型转换运算符的一般形式为63需要说明的一点是在强制类型转换时,得到一个所需类型的中间变量,原来变量的类型并未发生变化。例如inti;floatx=3.6;i=(int)x;printf(“x=%f,i=%d”,x,i);输出:x=3.6,i=3需要说明的一点是在强制类型转换时,得到一个所需类型的中间变量64思考题?main(){inta=32767,b=3;longc;c=a+b;printf("c=%ld",c);getchar();}Output:32770?-32766?c=(long)a+b;或c=(long)(a+b);思考题?main()c=(long)a+b;或c=(lo65x=x+nx=x-nx=x*nx=x/nx=x%nx+=nx-=nx*=nx/=nx%=n算术运算与赋值运算相结合例复合赋值运算符和复合赋值表达式x=x+nx+=n算术运算与赋值运算相结合例复合赋值运66main(){inta,b,c,d,e;a=2,b=5,c=6,d=10;a+=b;b-=c;c*=d;d/=a;a%=c;printf(“%d,%d,%d,%d,%d\n”,a,b,c,d,a);}Output:7,-1,60,1,7例main()Output:7,-1,60,1,767

注意:

如果复合赋值运算符的右侧是包含若干项的表达式,则右侧的表达式相当于一个整体。

如:x*=y+8——>x=x*(y+8)注意:如果复合赋值运算符的右侧是包含若干项的表达式683.4关系运算与逻辑运算所谓“关系运算”实际上是“逻辑比较运算”,将两个数据进行比较,判断其比较结果是否符合给定的条件。大于>,大于等于>=,小于<,不等!=,小于等于<=,恒等==六个==,!=的优先级低于其余四个优先级关系运算的优先级高于赋值,低于算术

区别赋值3.4关系运算与逻辑运算所谓“关系运算”实际上是“逻辑69在关系表达式中关系运算符的操作对象可以是算术表达式、关系表达式、逻辑表达式和字符表达式,且关系运算符要求其两个运算对象为同类型数据。关系表达式的值是一个逻辑值,即“真”或“假”,C语言没有逻辑型数据,因此C语言以1代表“真”值,以“0”代表“假”值。如a=3,b=2,c=1,则关系表达式a>b==c的值为真,表达式的值为1。在关系表达式中关系运算符的操作对象可以是算术表达式、关系表达70

关系符与运算分量构成关系表达式关系表达式的结果是一个逻辑值,根据关系是否满足,分别取真或假。例inti=1,j=7,a;a=i+(j%4!=0)a的值?结果:a=2结合性:从左向右a>b>ce1关系运算符

e2算术式100>=13.5<3a+b>c5*18==90(int)2.5!=2.5?关系符与运算分量构成关系表达式例inti=1,j=771逻辑运算符和逻辑表达式逻辑运算符是表述表达式之间的逻辑关系的一种运算符。“!”是单目运算符,“&&”,“||”是双目运算符。“!”的优先级高于“&&”,“&&”的优先级高于“||”,并且“!”优先级高于算术运算符,“&&”和“||”优先级低于关系运算符。“!”结合性为从右向左,“&&”和“||”的结合性为从左向右。逻辑运算符和逻辑表达式逻辑运算符是表述表达式之间的逻辑关系721.运算符&&(与):两边为1,结果为1||(或):两边有一个为1,结果为1!(非):非1为0,非0为12.优先级:!的优先级高于&&和||3.结合性:与和或是左结合,非是右结合1.运算符&&(与):两边为1,结果为12.73五、逻辑表达式用逻辑运算符将关系运算表达式或逻辑量连接起来构成逻辑表达式(a>b)&&(x>y);a>b&&x>y;(y||b)&&(y||a);y||b&&y||a;e1逻辑运算符e2五、逻辑表达式用逻辑运算符将关系运算表达式或逻辑量连接起来构74任何非零实数均作为逻辑上的1例:a=5,b=7,c=4,d=3x=(a+b)>(c+d)&&(d>a)先做算术运算,再做关系判断,将最后结果赋给x逻辑表达式的值是1或0,表示真或假任何非零实数均作为逻辑上的1例:a=5,b=7,c=4,d=75

在逻辑表达式中,并不是所有的逻辑运算都必须执行。如果&&的一边已经为0,结果一定为0如果||的一边已经为1,结果一定为1a&&b&&c

a非0时再判断b,a,b均非0再判断ca||b||c

a为非0,不必判断b和c,结果一定为1

在逻辑表达式中,并不是所有的逻辑运算都必须执76已知:a=1,b=2,c=3,d=4,m=1,n=1执行(m=a>b)&&(n=c>d)

之后m=?n=?由于a>b的值为0,&&的结果一定为0,即m=0(n=c>d)不再运算,n维持原有的值,即n=11<4&&4<71<4&&4>7!(2<=5)&&5(1>3)||!(2<5)(4<=6)&&!(3>=7)例10001求表达式的值:已知:a=1,b=2,c=3,d=4,m=1,n=1由于77用C语言描述1)a小于b或小于c2但a和b都大于c3)a和b中有一个大于c4)a是非正整数5)a是奇数6)a不能被b整除7)a是带小数的正数,b是带小数的负数如何表示闰年能够被4整除同时不能被100整除能够被400整除或用C语言描述1)a小于b或小于c2但a和b都大于c如何表示闰78条件运算符与条件表达式条件运算符是C语言中唯一的三目运算符,其形式为:表达式1?表达式2:表达式3条件运算符的功能是:先计算表达式1的值,若其值为非0值,即逻辑真值,则计算表达式2的值,并将表达式2的值作为整个条件表达式的结果,若表达式1的值为0,即逻辑假值,则计算表达式3的值,并将表达式3的值作为整个条件表达式的结果。条件运算符与条件表达式条件运算符是C语言中唯一的三793.5位运算数据在计算机中是以二进制代码的形式表示的,每一个二进制数称为一位。C语言的主要设计目的是为描述系统而设计的,因此C语言特别提供了对二进制位的操作功能,称为位运算。在此需要说明的一点是:位运算符的运算对象只能是整型或字符型的数据。3.5位运算数据在计算机中是以二进制代码的形式表示的,每80C语言提供了6种基本位运算,见P66表3-9。运算符含义对象个数结合方向优先级~按位求反单目自右向左1<<按位左移双目自左向右2>>按位右移双目自左向右2&按位与双目自左向右3|按位或双目自左向右4^按位异或双目自左向右5C语言提供了6种基本位运算,见P66表3-9。运算符含义对象81按位与运算a:1010,1001,0101,0111&b:0110,0000,1111,1011

c:0010,0000,0101,0011按位或运算a:1010,1001,0101,0111|

b:0110,0000,1111,1011

c:1110,1001,1111,1111按位与运算a:1010,1001,0101,011182按位异或运算a:1010,1001,0101,0111&b:0110,0000,1111,1011

c:1100,1001,1010,1100按位异或运算a:1010,1001,0101,0183按位与运算具有一些特殊的用途:清零。如果想将一个整数的个别位清零,则只要找到一个二进制数,其相应位的值位0,然后使两个数进行按位与运算,即可达到清零的目的。取一个数中的某些指定位,只需要将其与一个相应位的值为1的整数进行按位与运算即可。按位与运算具有一些特殊的用途:84按位或运算具有的一些特殊的用途:按位或运算常用来对一个数据的某些位置1。只需要将这个数与一个相应位为1的整数进行按位或运算即可。按位异或运算具有的一些特殊的用途:使特定位翻转:如果想使变量a的低四位翻转,即0变为1,1变为0,可以将它与00001111进行按位异或运算。要使哪几位翻转就将与其进行位异或运算的整数的该几位置1即可。与0相异或,保留原值按位或运算具有的一些特殊的用途:85按位取反运算(~)按位取反运算规则是将二进制数按位取反,即将0变成1,将1变成0。左移运算符左移运算符用来将一个数的各二进制位全部左移若干位。例如a<<2。高位左移后溢出,舍去不起作用,右边补0。左移n位相当于该整数乘以2n,例如15<<2=60。但此结论只适用于该数左移时被移出舍弃的高位种不包含1的情况。按位取反运算(~)86右移运算符右移运算符用来将一个整数的各二进位全部右移若干位,例如a>>2。移到右端的低位被舍弃,对无符号数,高位补0。对于有符号数,如果原来符号位为0(该数为正),则左侧移入0;如果原来的符号位为1(即该数为负),则左侧移入1。右移一位相当于除以2,右移n位相当于除以2n。右移运算符87移位运算a:1101,0011b=a<<2:0100,1100

c=a>>2:0001,0011移位运算a:110883.6其他运算符逗号运算符和逗号表达式逗号运算符用于将多个表达式连接在一起构成逗号表达式,逗号运算符又称为“顺序求值运算符”,逗号表达式的一般形式为表达式1,表达式2,……表达式n逗号表达式的求解过程是:先求解表达式1的值,再求解表达式2的值,从左向右依次求解各表达式的值,最后求得表达式n的值,整个逗号表达式的值就是表达式n的值。逗号运算符的优先级最低,优先级为153.6其他运算符逗号运算符和逗号表达式89(表达式1,表达式2,表达式3,……表达式n)逗号表达式的值为最后一个表达式的值(表达式n的值)X=(

(a=4*5,a*2),a+6)a为?

20x为?26(表达式1,表达式2,表达式3,……表达式n)逗号表90“.”和“->”运算符“.”和“->”运算符的作用是引用构造数据类型的结构和联合中的分量。优先级最高结合性自左向右结构变量名.成员结构指针变量名->成员形式:“.”和“->”运算符“.”和“->”运算符的作用是引用构造91()和[]运算符优先级最高,结合性是自左向右()的作用:改变运算次序函数参数表强制类型转换或sizeof运算[]的作用:数组的说明数组元素的下标表示()和[]运算符优先级最高,结合性是自左向右92“*”和“&”运算符“*”指针运算符,访问指针所指向的内容“&”地址运算符,取指定变量的地址(type)运算符强制类型转换运算符,将右边表达式的值转换为括号中指定的数据类型sizeof(opr)运算符求出运算对象在计算机内存中所占用的字节数量opr为表达式或数据类型名,是表达式时括号可省略“*”和“&”运算符93(),[],.,->~,!,++,--,-,&,*,(类型),sizeof(右结合)*,/,%+,-<<,>><,<=,>,>===,!=&^|&&||?:(右结合)=(+=,-=,...)(右结合),

算术运算符关系运算符逻辑运算符移位运算符位运算符运算符优先级、结合性小结(),[],.,->高算术运算符关系运算943.7混合运算与数据类型转换各类数值型数据间的混合运算:将不同数据类型先转换成同一类型,然后进行运算。方式自动进行-------隐式转换强制进行-------显式转换隐式转换(算术转换)优先级低的向优先级高的转换规则3.7混合运算与数据类型转换各类数值型数据间的混合运算:95longunsignedintchar精度高精度低例2.0+1/2;表达式的值?2.0doublefloatlongunsignedintchar精度高精度低例2.096f的类型?int

double

doubledouble已知:inti;longe;floatf;douibled;f=10+‘a’+i*f-d/edouble例运算过程中的类型转换不是变量本身数据类型的转换f的类型?intdoubledoubledo97强制类型转换转换形式(类型标识符)表达式(int)

(10+’a’+i*f-d/e)将该结果强制转换为整型还可以赋值转换,输出转换等强制类型转换转换形式(类型标识符)表达式(int)(10+98本章作业第3章,P

75

选择题:1,6,10,14,15,17,18,25,26,27本章作业第3章,P

75

99C语言程序设计教程主讲:邓宏彬北京理工大学计算机学院C语言程序设计教程主讲:邓宏彬100复习基本概念什么是算法,如何设计算法?算法的两要素:基本功能操作控制结构常用算法枚举法、迭代法、递推法、递归法算法的特点有穷性、确定性、有效性、I/O算法的表示流程图复习基本概念101C语言的发展历程C语言的特点C程序的结构规则函数的基本单元、main函数等标准库函数C语言的关键字(32个)C语言的上机执行过程C语言的发展历程102第三章数据类型与运算规则本章要点:数据与数据类型基本数据类型及其表示算术运算与赋值运算关系运算与逻辑运算位运算其它运算混合运算及数据类型转换第三章数据类型与运算规则本章要点:1033.1数据与数据类型数据是程序加工、处理的对象,也是加工的结果。具有同样性质的数据可被分成一些集合,程序能对它们进行同样的操作、或采用同样的编码等,这样的集合称为数据类型。所有的程序语言都是用数据类型来描述程序中的数据结构、数据表示范围、数据在内存中的存储分配等。数据类型是计算机科学的核心概念之一。3.1数据与数据类型数据是程序加工、处理的对象,也是加104常数变量运算符表达式函数??

把自然语言描述问题的方式转换为C语言的形式表达给计算机规则表达式常数变量函数运算符算例常数??把自然语言描述问题的方式转换为C语言的形式表105常数3、5和3.6的存放空间是否相同?变量a如何表示?如何存放?计算机如何知道3.6和a之间的关系?和

如何输入?如何存放?计算机如何识别“=”?运算结果放在哪里?数据的描述数据的操作程序类型运算符计算机完成上述计算,首先要解决数据的输入和存放问题常数3、5和3.6的存放空间是否相同?数据的描述程序类型运106程序的任务是对数据进行处理,数据是程序处理的对象,而运算符是施加给这些数据的操作。数据和运算符是表达式的基本元素程序的任务是对数据进行处理,数据是程序处理的对象,而运算符是107C语言的数据类型数据类型构造类型指针类型空类型(无值类型)void枚举类型enum数组类型结构类型struct联合类型union基本类型整型int字符型char实数型(浮点型)单精度实型float双精度实型doubleC语言的数据类型数据类型构造类型指针类型空类型(无值类型)1083.2C语言基本数据类型及其表示

3.2.1常量与变量常量:在程序运行过程中,其值不能改变的数据称为常量。常量可以分为直接常量和符号常量,直接常量包括整型常量、实型常量、字符常量和字符串常量,如12,4.6,‘a’,“CHINA”等。符号常量是指用一个指定的标识符代表某个常量,在程序中需要使用该常量时就可以直接引用标识符。C语言中用宏定义命令对符号常量进行定义,其定义形式为:#define标识符常量#definePAI3.1415926常量并不占内存,在程序运行时直接调入寄存器中。3.2C语言基本数据类型及其表示3.2.1常量与变109变量在程序运行过程中,其值可以改变的数据称为变量。变量通过变量名标识,变量名和内存中的存储单元相对应。编写程序时通过变量名来存、取存储单元。C语言是一种强制定义型语言,变量必须先定义,后使用,定义时必须提供变量的名字和类型。变量可以分为数值变量、字符变量和指针变量。其中数值变量包括整型变量和实型变量。变量memorya825612变量变量memorya825612110变量名由字母A、B、…、Z、a、b、…、z,数字0、1、…、9和下划线_组成。变量名的第一个字符必须是英文字母或下横线。不能用系统中的关键字作为变量名变量名中的字母是区分大小写的。sum、stu_name、_age、Lts_1_2、a232c、x.y、start+9、c2.0NAMEname表示两个不同的标识符。养成良好的命名习惯变量名的规定变量名由字母A、B、…、Z、a、b、…、z,数字0、1111●变量必须先定义后使用如:inta,b;a=10;b=a*12;c=a+b;×

15

1000K变量的3个属性:变量地址变量内容

变量名●变量必须先定义后使用×151000K变量的1123.2.2整型数据整型常量整型常量的类型根据值大小默认类型在常量后面加l或L,表示longint型例如:123L,0L,432l都是longint型常量整型数据包括整型常量和整型变量,

整型数据以二进制补码形式存储

整型常量的不同数值表示方法 10进制:0~9 8进制:0~7,以0开头 16进制:0~9,A~F/a~f,以0x或0X开头

100、-8、0;010、024;0x38、0X1F3.2.2整型数据整型常量整型数据包括整型常量和整型变量113

数据在计算机内存中是以二进制数形式存放的。实际上,在计算机当中数据是以补码的形式存储的。正数的补码是它本身,负数的补码是其绝对值取反加1。例如-10原码1000000000001010绝对值0000000000001010取反1111111111110101加11111111111110110—>-10数据在计算机内存中是以二进制数形式存放的。114共六种基本整型短整型长整型无符号整型无符号短整型无符号长整型intshortintlongintunsignedintunsignedshortunsignedlong占存储空间占内存字节数224224字节?整型变量共六种基本整型int占存储空间占内存字节数2字节?整型变量115例如:inti,j;longk,m;

unsignedintx,y;变量有值吗?C中的所有变量必须先定义后使用!!格式:类型说明符变量列表;!整型变量的定义例如:inti,j;变量有值吗?C中的所有变量必须先116整型变量的分类数据类型占用字节二进制位取值范围int216-32768~32767(-215~215-1

)short216-32768~32767long432-2147483648~2147483647signed216-32768~32767signedshort216-32768~32767signedlong432-2147483648~2147483647unsigned2160~65535unsignedshort2160~65535unsignedlong4320~4294967295(0~232-1)整型变量的分类数据类型占用字节二进制位取值范围int2161170000000000000001000000000000001101111111111111111000000000000000=1=3最大的负数?=-215=-32768

定点二进制补码表示占2个字节存储数的表示范围:-32768~32767最高位“1”表负数,“0”表正数?-215

的补码a=215-1=32767最大的正数?int型数的表示范围:00000000001183.2.3实型数据C语言中实数和实型变量可分为三种类型:单精度型(float,4字节)双精度型(double型,8字节)长双精度型(longdouble,16字节)。单精度实型数据的有效数字是7位,双精度实型数据的有效数字是16位,长双精度实型数据的有效数字是19位。3.2.3实型数据C语言中实数和实型变量可分为三种类型119名称 存储字节 表示范围 说明方法有效位单精度(尾加F)

4 -1038--1038 floata; 7双精度(尾不加)

8 -10308--10308 doublea; 16长双精度(尾加L)

16 -104932-104932 long

doublea;192.实型变量011111110111111111111111111111111-2-23≈127-1=1272127≈1038与课本46页对比!名称 存储字节 表示范围 说明方法120数的范围数的取值范围是指数的绝对值有效位数据在计算机中存储和输出时能够精确表示的数字位数

二进制7位

二进制23位单精度实型尾数阶码阶符数符数的范围二进制7位二进制23位单精度实型尾数阶码阶符121实型常量的表示方法1.小数形式(至少有一个小数点和一个数字)0.12,.12,12.0,12.2.指数形式(e前有数字,e后有整数)1.34510-21.345e-2

尾数指数

1.2e3,12e-2,e21.2e3e1.2×××实型常量的表示方法1.小数形式2.指数形式尾数指数122?实型数的分辨率:最小正数:10-38小于该数时处理为0下溢最大正数:1038大于该数时提示出错上溢实型数在计算机内部都按指数形式存放实型数常数一般都作为双精度数处理

数的存储结构和精度与计算机硬件特性有关!超出表示范围的数机器如何处理??实型数的分辨率:实型数在计算机内部都按指数形式存放123

main(){floata,b;a=0.123e40;b=0.123e-40;c=12345.6789;printf("a=%e,b=%e\n",a,b);printf("%f\n",1.234);printf("%f\n",c);

printf("%f\n",1111111111.2222222222f+1111111111.2222222222f);printf("%f\n",1.123456789);getch();}

20位上溢下溢为06位小数16位有效数7位有效数6位小数main()20位上溢下溢为06位小数16位有效数71243.2.4字符型数据将一个字符常量放到一个字符变量中,实际上并不是将该字符本身放到相应变量的内存单元中,而是将该字符的相应的ASCII码放到相应的存储单元中。字符型数据包括字符型常量和字符型变量。字符型常量又被称为字符常数。C语言中字符型常量是用单引号括起来的一个字符,如‘a’,‘A’。由于C语言对字母的大小写是敏感的,因此‘a’和‘A’是不同的字符型常量。3.2.4字符型数据将一个字符常量放到一个字符变量中,实125字符型常量在此有两点需要注意:字符型常量使用单引号作为标识。字符型常量只能包含一个字符。例‘a’,’A’,‘1’‘abc’、“a”字符型常量在此有两点需要注意:例‘a’,’A’,‘1’126定义形式char占存储空间一个变量1字节一个字符变量只能包含一个字符例Main(){charc;c=‘c’;printf(“%c”,c);}运行结果:c?题目中有几个c,哪些是等价的?字符型变量定义形式char一个变量1字节一个字符变量只能包含一127‘a’的ASCII值为97

内存中存储形式01100001在ASCII范围以内,整型数据!字符型数据的存储格式:ASCII码字符‘a’、’A’、‘1’

存储为:97、65、49例‘a’的ASCII值为9701100001128字符串常量字符串常量是用双引号括起来的一个或多个字符。n个字符组成的字符串常量,在内存中占空间为n+1个字节china\0字符串结束标记“空”字符“a” 串长1“ThisisCstring”串长16

“”(空格) 串长1

“”(不含空格) 串长0例C中没有专用的字符串变量!字符串常量字符串常量是用双引号括起来的一个或多个字符。n个字129对于不可显示字符,C语言提供的另一种字符型常量是转义字符常量。转义字符常量是以“\”开头的字符常量,它通知编译器需要用特殊的方式处理“\”后的字符,将“\”后的字符转换成另外的意义。\n换行\t水平跳格\b退格\r回车\f走纸换页\\反斜杠\’单引号字符\”双引号字符\dddddd表示1到3位八进制数字\xhhhh表示1到2位十六进制数字对于不可显示字符,C语言提供的另一种字符型常量是转义字符常量130例:‘\60’是十进制数48,代表ASCII码字符0‘\105’是十进制数69,代表ASCII码字符E‘\015’是十进制数13,代表ASCII码字符回车‘\x1f’是十进制数31,代表ASCII码字符▼‘\x61’是十进制数97,代表ASCII码字符a例:131main(){chara,b,c;intd;a='\5';b='\60';c=’A';d=1089;printf("a=%cb=%cc=%dd=%c\n",a,b,c,d);printf(“a=%db=%d\n",a,b);getch();}按整数输出C按字符输出D00000100

01000001d6500110000b=‘\60‘在计算机中的存储按字符和整数输出amain()按整数输出C按字符输出D000001132思考:*

字符串

“w\11”占几个字节?转义字符字符串结束标记

w\11*

字符串“w\11\0good”占几个字节?3字节思考:*字符串“w\11”占几个字节?转义字符字符串结133指针型数据及其表示C语言定义了一种新的数据类型——指针类型,它是一个变量在内存中所对应的存储单元的地址。用来存放指针的变量称为指针变量。高级语言中的变量具有三个属性变量名变量的值变量的地址指针型数据及其表示C语言定义了一种新的数据类型——指针类型134访问内存的两种方式:直接访问:按地址直接存取&a间接访问:通过指针p间接存取100010061002102310abc3.551000p对于inta=10,c=5;floatb=3.5;内存分配例a的地址存储变量2字节a的内容指针a的地址a是整型变量,存放内容p是指针变量,存放地址a的地址指向a访问内存的两种方式:100010061002102310a135*指针运算符&取地址运算符。例如:inta;int*p;则&a为变量a的地址,*p为指针变量p所指向的存储单元所存储的内容。*指针运算符136例:inta=10,*p,x;floatb=3.5,*p1;charc,*p2=&c;p=&a;p1=&b;x=*p;*p=a定义:类型说明符*指针变量名*p是p指向的变量a指针运算*p*p定义指针变量指针初始化指针赋值指针变量的定义与赋值类型说明符用来指定该指针变量指向的变量的类型,而并非指针的类型。C语言允许指针指向任何类型的对象,包括别的指针。例:inta=10,*p,x;*p=a定义:类型说明符137*--指针运算符&--取地址运算符同级,右结合指针变量的赋值inta=3,*p,*p1,*p2,*p3,p4;p=&a;/*取a地址运算*/p1=p;/*直接赋值*/p2=MULL;/*赋空值,不指向任何变量*/P3=0;p4=‘\0’;指针变量的操作

inta=3,*p,*p1,k;p=&a;/*a地址P*/k=*P;

/*3k*/*p=20;/*20a*/*&a=30;/*先取a的地址,再按地址赋值30a*/p1=&*p;

/*因为&*p=&a,操作结果使p1指向a*/*--指针运算符指针变量的赋值inta=3,*p,*p1,138问题1:int*i;float*p1;指针变量i中只能指向整型变量?指针变量p1中只能指向实型变量?问题2:指针变量能指向常数吗?讨论!指针的应用在第十章介绍问题1:int*i;float*p1;问题2:指针变139变量初始化C语言允许变量初始化具有两种形式:一种是先声明后赋值,另一种是在定义变量的同时对该变量进行初始化。inta=3;inta,b,c=5;初始化不是在编译时进行(外部变量和静态变量除外),而是在程序运行时完成的。变量初始化C语言允许变量初始化具有两种形式:一种是先声明后1403.3算术运算和赋值运算运算符是用于描述对数据进行运算的特殊符号。C语言的运算符按其在表达式中与运算对象的关系可以分为:单目运算符双目运算符三目运算符。3.3算术运算和赋值运算运算符是用于描述对数据进行运算141运算分量对数据进行运算的符号被加工的数据+表达式运算符X=5+b*cC语言中的运算符和表达式表达式的运算结果称为表达式的值运算分量对数据进行被加工+表达式运算符X=5+142学习运算符应掌握的要点运算符的种类与功能运算符与运算分量的关系个数类型A+B(a>b)?a:b目关系

温馨提示

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

评论

0/150

提交评论