版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第三章数据类型、运算符和表达式主要内容:C语言的数据类型常量与变量整型数据浮点型数据字符型数据变量赋初值各类数值型数据间的混合运算算术运算符和算术表达式赋值运算符和赋值表达式逗号运算符和逗号表达式1第三章数据类型、运算符和表达式主要内容:1§3.1C语言的数据类型计算:3*2数值型数据在屏幕上显示“我是河科人"字符串常量到"203"房间找某人指针型数据学号为101-103的全体学生数组型数据算法处理的对象是数据,数据是数据的组织形式即数据结构。不同的数据之间往往存在某些联系。不同的计算机语言使用的数据结构是不相同的。所以,处理同一类问题,如果数据结构不同,算法也会不同。因此,在程序设计时,应综合考虑算法和数据结构。选择最佳的数据结构和算法。回顾第二章:问题的提出:2§3.1C语言的数据类型计算:3*2§3.1C的数据类型数据类型基本类型构造类型指针类型空类型数值型字符型枚举类型整型数据实型(浮点)数据单精度型双精度型数组类型结构体类型共用体类型所有的数据,在进行处理时都需要先存放进计算机的内存中,所以了解不同的数据在计算机中存储的形式是很重要的。3§3.1C的数据类型数据类型基本类型构造类型指针类型空类§3.2常量与变量在程序设计中,我们不仅使用到常量,如:123,-90,0.125等,而且我们更多地还要使用变量,因为它们的值在程序的运行中是可以改变的。本节内容需要了解常量及变量的概念、变量的命名规则。4§3.2常量与变量在程序设计中,我们不仅使用到常量,如C语言字符集1、英文字母:大小写各26个,共计52个;2、阿拉伯数:0~9共10个数字;3、下划线:_;4、特殊符号:通常指由1~2个符号组成的运算符。算术运算符:+-*/%++--关系运算符:<>>=<===!=逻辑运算符:&&||!位运算符:&|~^>><<条件运算符:?:和=(即赋值运算符)其他分隔符:()[]{}.,;一、C语言字符集、标识符和关键字5C语言字符集一、C语言字符集、标识符和关键字5C语言的标识符标识符:用来标识变量名、符号常量名、函数名、数组名、类型名、文件名的有效字符序列。标识符就是一个名字。合法标识符:由字母、数字、下划线组成且第一个字符必须为字母或下划线;不允许超过32个字符。但为了程序的可移植性,建议不要超过8个字符。例:student_name与student_code是一样的标识符,超过8个的舍去。用户标识符:去掉32个关键字后的合法标识符.例如:int、float、if等,是C语言的关键字,不能作为用户标识符。注意:*C语言标识符中大、小字母不通用。例:sum和SUM是两个不同的标识符。*C语言规定,保留关键字不能作为用户标识符。*C语言的保留关键字共有32个见附录B。6C语言的标识符标识符:用来标识变量名、符号常量名、函数C语言的标识符√×√×√××√××.不能作标识符-不能作标识符不能以数字开头关键字不能作用户标识符关键字不能作用户标识符#不能作标识符a1abc.ca_ba-babc1233aintIntLen#1else合法标识符:_22A,lea_1,avg3,day,ABCde43xyw8不合法标识符:M.J.YORK,$_238,#xy,a*b,8Tea判断下列用户标识符的合法性:7C语言的标识符√×√×√××√××.不能作标识符-不能作就是具有特定含义的标识符,用户不能用来作为自定义标识符。由ANSI标准推荐的关键字有32个,常用的有:
与数据类型有关的:charintfloatdoublesignedunsignedshortlongvoidstructuniontypedefenumsizeof
与存储类别有关的:
autoexternregisterstatic
与程序控制结构有关的:dowhileforifelseswitchcasedefaultgotocontinuebreakreturn 关键字8就是具有特定含义的标识符,用户不能用来作为自定义标识符。二、常量与符号常量常量:在程序运行过程中,其值不变的量称为常量,如:85,-67,23.7,’A’,’9’,“A”等。一般从字面上即可判别,这种常量叫直接常量(字面常量)。常量的分类:(1)整型常量(2)实型常量(3)字符常量(4)字符串常量(5)符号常量。常量的类型,可通过书写形式来判别。符号常量:用一个标识符来表示一个常量就叫作符号常量,符号常量的常用预处理命令define来实现,其定义形式为:
#define标识符常量例如:#define
PI3.1415含义为:定义PI为符号常量,其值为3.1415说明:一般习惯上用大写字母表示符号常量,用小写字母表示变量,以示区别。但仅仅是习惯而不是规定。9二、常量与符号常量常量:在程序运行过程中,其值不变的量称为程序L3-1.C符号常量的使用#definePRICE30#include<stdio.h>main(){intnum,total;num=10;total=num*PRICE;printf(“total=%d\n”,total);}好处:1.含义清楚;定义符号常量时,要做到”见名知意”;2.在需要改变一个常量时,能做到”一改全改”。说明:1.程序中的PRICE都代表302.符号常量的值在其作用域内不能改变,也不能再赋值3.如果再用PRICE=40给符号常量赋值是错误的运行结果:total=300注意:PRICE与30之间不允许有=号。10程序L3-1.C符号常量的使用#define符号常量使用时的注意事项注意:(1)一般习惯上用大写字母表示,以便与变量区分开(如果用小写字母也可以,只是为了与变量区分,是习惯而不是规定);(2)定义符号常量时,不能以“;”结束;(3)一个#define占一行,且要从第一列开始书写;(4)一个源程序文件中可含有若干个define命令,不同的define命令中指定的“标识符”不能相同;11符号常量使用时的注意事项注意:11三、变量变量:在程序运行过程中,其值可以改变的量,称为变量。变量的定义:
类型标识符
标识符1,标识符2,......标识符n;注意事项:(P39)在选择变量名和其他标识符时,应做到“见名知意”。不允许是关键字。要求对变量须进行强制性定义,即必须“先定义、后使用”。每个变量必须被指定为一种确定类型,以便编译时能为其分配存储单元。
inta,b,c;/*a,b,c为整型变量*/
floatx,y,z;/*x,y,z为单精度型变量*/12三、变量变量:在程序运行过程中,其值可以改变的量,称为变三、变量变量的组成要素变量名变量类型变量值例如:inta=1515内存中的数据数据15内存通过变量,可以为内存中的位置提供一个有意义的名称在对程序编译连接时由编译系统给每一个变量名分配对应的内存地址。从变量中取值,实际上是通过变量名找到相应的内存地址,从该存储单元中读取数据。a变量值内存单元变量名1513三、变量变量的组成要素15内存中的数据数据15内存通过变量§3.3数值型数据的表示一、整型常量表示形式十进制整数:与数学上的整数表示相同。如:123,0,-456八进制整数:以数字0开头,如:0123=1*82+2*81+3*80=(83)10
-011即(-11)8=(-9)10十六进制整数:以数字0和字母x开头,如:0x123,-0xa2如:0x123=1*162+2*161+3*160=(291)10
-0xa2即(-a2)16=(-162)10*八进制的数码范围为0~7;018
*十六进制的数码除了数字0~9外,还使用英文字母a~f(或A~F)表示10~15。如:0x1e√
注意!在VC++6.0中数值型数据有两种:整型和实型14§3.3数值型数据的表示一、整型常量*八进制的数码范整数的存储空间为4个字节,即32个二进制位。取值范围为-231—231-1,即-2147483648—2147483647。§3.3数值型数据的表示在VC++6.0中数值型数据有两种:整型和实型一、整型常量整数(有符号的整数)在内存中存放的是它的补码,无符号数没有符号位,存放的就是原码。整数占用的字节数与机型有关,32位机上占用4个字节。
15整数的存储空间为4个字节,即32个二进制位。§3.3数整型数据在内存中的是按它的补码来存放的。如果要知道一个有符号的整数在内存中的存储形式,一般方法是: 原码→反码→补码如果已知内存中的一个二进制编码,还要用相反的方法将其转换成有符号数。请关注:16整型数据在内存中的是按它的补码来存放的。原码→反码→补码如果补充:带符号数在计算机中的表示整数在计算机中是按补码存储的。原码:用最高位作符号位,0表示正数,1表示负数;其余各位表示数值的大小。反码:正数的反码与原码相同,负数的反码是将原码除最高位之外,其它各位按位取反。补码:正数的补码与原码相同,负数的补码是将反码的最低位加1。数值数据有带符号数和无符号数之分。注意:负数的求补码的另一种方法:将该数的绝对值的二进制形式,按位取反再加1。17补充:带符号数在计算机中的表示整数在计算机中是按补码存储的。34和-34的8位编码例如:整数34的8位(1字节)编码原码:00100010反码:00100010补码:00100010例如:整数-34的8位(1字节)编码原码:10100010反码:11011101补码:11011110内存中存储形式内存中存储形式1834和-34的8位编码例如:整数34的8位(1字节)编码34和-34的16位编码例如:整数34的16位(2字节)编码原码:0000000000100010反码:0000000000100010补码:00000000
00100010例如:整数-34的16位(2字节)编码原码:1000000000100010反码:1111111111011101补码:11111111
11011110内存中存储形式内存中存储形式1934和-34的16位编码例如:整数34的16位(2字节)二、整型变量在C语言中,可以使用整型变量存放一个整型数据,使这个变量的值在程序运行时能够发生变化。每定义一个变量,VC++系统就会给该变量分配存储单元,用户可随时改变该存储单元的内容。但是,若存储单元太大,会浪费存储空间;若存储单元太小,又影响存储的范围和精度。因而,VC++规定了不同类型的整型变量。§3.3数值型数据的表示20二、整型变量在C语言中,可以使用整型变量存放一个整型数据1、整型数据在内存中的存放形式编译系统为整型变量在内存中分配了4个字节的存储单元,数值以补码形式存储。2、整型变量的分类整型变量的基本类型符为:int根据数据所占的二进制位数分为:int,long,short同样存储长度的数据又分为:unsigned,signed(隐含)故可组合出六种类型。3、整型变量值的范围
由机器中数据的存储长度决定。(见下表)211、整型数据在内存中的存放形式3、整型变量值的范围21整型类型与数值范围如VC++6.0中,数据长度:
short(2字节)≤int(4字节)=long(4字节)
关键字
所占位数
取值范围
short16(2B)
-32768~32767即-215~(215-1)
unsignedshort16(2B)
0~65535即0~(216-1)
int32(4B)-231~(231-1)
unsignedint32(4B)0~(232-1)
long32(4B)
-2147483648~2147483647
unsignedlong32(4B)
0~4294967295即0~(232-1)如何判断字节数呢?printf("%d\n",sizeof(unsignedlongint));22整型类型与数值范围如VC++6.0中,数据长度:sho★如果既不指定unsigned也不指定signed,则隐含为signed,因此存储单元中最高位为符号位(0为正,1为负)★如果指定unsigned,则存储单元中全部二进制位用作存放数值本身。★无符号型变量只能存放不带符号的整数,而不能存放负数。★一个无符号整型变量存放的正数范围比一般有符号整型变量中正数的范围扩大一倍例如:inta;/*变量a的数值范围为-231~231-1,a的最大值2147483647*/unsignedintb;
/*变量b的数值范围为0~232-1,b的最大值4294967295*/
思考题:如果变量a=32767,再加1会出现什么情况?(见下页)注意!23★如果既不指定unsigned也不指定signed,则隐整型数据的溢出问题例3.3整型数据的计算#include<stdio.h>main(){inta,b;a=32767;b=a+1;printf(“%d,%d\n”,a,b);}运行结果:
32767,32768思考:将intb改为shortb,程序运行后b的值是什么?24整型数据的溢出问题例3.3整型数据的计算思考:将in整型数据的溢出例3.3”整型数据的溢出#include<stdio.h>main(){inta;shortb;a=32767;b=a+1;printf(“%d,%d\n”,a,b);}运行结果:
32767,-327681000000000000000011111111111111132767-32768如下图:a:b:注意:此时,32767加1得不到32768,而得到-32768这2个例子就说明了数据在内存中的存储形式不同,结果会不同!25整型数据的溢出例3.3”整型数据的溢出10000004、整型变量的定义整型变量的定义形式:类型标识符变量名1[,变量名2,……变量名n];如:inta,b,c;long
intaa,bb,cc;longa1,a2;unsignedu1,u2;其中int为类型标识符,a,b,c为变量名。其中longint为类型标识符,aa,bb,cc为变量名。其中long为类型标识符,a1,a2为变量名。其中unsigned为类型标识符,u1,u2为变量名。变量必须“先定义、后使用”。自己设定,满足标识符的规定。;不可省对变量的定义一般是放在一个函数的开头声明部分。264、整型变量的定义整型变量的定义形式:类型标识符变量程序L3-2.C功能:整型变量的定义及使用#include<stdio.h>main(){inta,b,c,d;unsignedu;a=12;b=-24;u=10;c=a+u;d=b+u;printf(“a+u=%d,b+u=%d\n”,c,d);}运行结果:a+u=22,b+u=-14说明:不同种类的整型数据可以进行算术运算!27程序L3-2.C功能:整型变量的定义及使用#include<三、整型常量的类型如果一个整数的值在-231~231-1范围内,认为它是int型,可以赋值给int型和longint型变量。VC++6.0中,分配给long和int的内存空间相同,所以一个int型常量既可赋值给long也可给int型变量。一个整常量后加一个字母u或U,认为是unsignedint型(即存储单元中最高位不作为符号位,作为数据本身)例如:若写成-12345u,则先将-12345转换成其补码53191,然后按无符号存储。一个整常量后面加一个字母l或L,认为是longint型。常量的类型有哪些?如何将整型常量赋给一个整型变量?请注意以下几点:28三、整型常量的类型如果一个整数的值在-231~231-1范围§3.4实型(浮点型)数据在程序设计中,不仅要使用到各种类型的整数,而且更多地要使用实数。如:求下面数列的前100项之和:就必须使用实型数据。29§3.4实型(浮点型)数据在程序设计中,不仅要使用到各一、浮点型常量的表示形式十进制小数形式:包含整数部分、小数点和小数部分,如:0.12,12.,23.0,1.0,.3,-2.5等。注意:小数点不能省略。指数形式:“十进制小数”+“e(或E)”±“十进制数整数”。如:2.7E12,123e+2,2.45e-2分别表示2.7×1012,123×102,2.45×10-2但注意:小数点不能单独出现;0.√.0√.e或E的两边必须有数字,且e后必须为整数;如:6E0.2e5
例如:e+3、2.03e+0.5、.e3、e都是非法的实型常量表示方法。在字母E或e之前的小数部分中,小数点左边应有一位且只能有一位非0的数字,称为“规范化的指数形式”。例:1.23e2是规范化的,0.0123e2,12.3e1不是规范化指数形式。一个浮点数在用指数形式输出时,是按规范化的指数形式输出的。30一、浮点型常量的表示形式十进制小数形式:包含整数部分、小数点二、浮点型变量变量类型标识符存储单元数值范围有效数字单精度float4字节(32位)10-38~10+386~7位双精度double8字节(64位)10-308~10+30815~16位1、浮点型数据在内存中的存放形式占4个字节(32位),分为小数部分和指数部分。小数部分占的位数越多,数的有效数字越多,精度就越高。指数部分越大(占的位数越多),表示数值范围越大。如果要求精度特别高,可以采用双精度浮点类型,有效位达16-17位。2、浮点型变量的分类31二、浮点型变量变量类型标识符存三、浮点型变量的定义浮点型变量的定义形式:类型标识符变量名1,变量名2,……变量名n;如:floata,b,c;doublea1,a2;其中float为类型标识符,a,b,c为变量名。其中double为类型标识符,a1,a2为变量名。对每一个浮点型变量都应在使用前加以定义32三、浮点型变量的定义浮点型变量的定义形式:类型标识符四、浮点型数据的舍入误差例如:#include<stdio.h>main(){floata,b;a=123456.789e5;b=a+20;printf(“%f\n”,b);}输出结果:12345678848.000000注意:应避免一个很大的数和一个很小的数直接相加、减,否则会“丢失”小的数。即有效数字以外的数字就不精确了。33四、浮点型数据的舍入误差例如:输出结果:1234567884五、浮点型常量的类型C语言编译系统常将浮点型常量作为double型来处理。例:floatff=2.45678*4523.65系统先将两数作为double型,运算之后的结果,取前7位赋给float型的f.一个浮点型常量可以赋值给float型、double型变量,那么系统会根据变量的类型截取实型常量中相应的有效位数字。例:floata;a=11111.111此时,a只能接收7位有效数字,最后两位小数就不起作用。如果将a改为double型,则9位有效数字就都存储在变量a中了。34五、浮点型常量的类型C语言编译系统常将浮点型常量作为doub§3.5字符型数据在程序设计中,除了需要使用整型和实型数据之外,还需要另外一种很重要的数据类型,即字符型数据,如姓名,文字信息等,都是字符型数据,也叫文字型数据。文字型数据有两种类型:单个字符和字符串35§3.5字符型数据在程序设计中,除了需要使用整型和实基本ASCII码表的前32个字符为控制字符(ASCII码值为0~31)。接着为标准英文键盘上的每一个字符都规定了一个ASCII码值,字符在内存中的存储格式按照ASCII码值所对应的二进制数确定。空格——3200100000A——6501000001a——9701100001b——980110001036基本ASCII码表的前32个字符为控制字符(ASCII码值为一、字符常量字符常量:用单引号括起来的一个字符。如:‘A’、‘e’、‘?’等。由反斜杠(\)引导的转义字符。如:“\n”表换行符。注意:a与'a'不同,前者为变量,后者为字符常量。9与‘9’也不同,前者为整型常量,后者是字符常量。‘a’与‘A’是不同的字符常量。
每个字符型数据在内存中占一个字节;其存储的内容为该字符在ASCII码表(见附录A)中对应的数值。37一、字符常量字符常量:注意:a与'a'不同,前者为变量,后以“\”开头的字符序列称为转义字符,这些字符的含义不是其本身,而是转成了新的意义。
\n 换行,将当前位置移到下一行开头\t 换区(横向跳格,跳到下一个输出区,一区占8列)\b 退格(删除前面的一个字符)\r回车,将当前位置移到本行开头\\代表一个反斜杠字符(\)
\’ 代表一个单引号字符(')
\” 代表一个双引号字符(")
\ddd 1~3位8进制数所表示的字符
\xhh 1~2位16进制数所表示的字符字符形式 功能38以“\”开头的字符序列称为转义字符,这些字符的含义转义字符的应用举例printf("\n1234\nabcd\n");printf("\7");printf("\nab\tcd\tef\n);printf("\n1234\b\n");printf("\40\n");printf("\'\''\x41\n");1234abcd响一声铃声abcdef123空格(相当于”\040\n”)(空格的ASCII码=32)'"Aprintf(“\’abc\\cde\’\n”);printf(“\101\x56\n”)‘abc\cde’(9个字符)AV(2个字符)重要考点:数字符的个数是关键!39转义字符的应用举例printf("\n1234\nabcd\二、字符变量字符变量:只能存放一个字符并能改变其值的变量。字符型变量在内存中占1个字节。字符变量的定义:char变量名;例如:charc1,c2,c3,c4;变量c1,c2,c3,c4中可存储字符数据、介于-128~127的整数或者转义字符。例如:字符A的ASCII码为:65D(十进制)=41H(十六进制)=101Q(八进制)∴字符A可以表示为‘A’、’\x41’、’\101’。字符变量分类:char和unsignedchar;40二、字符变量字符变量:字符变量的定义:char变三、字符型数据在内存中的存储形式及使用方法存储形式:按ASCII码存储。使用方法:
按字符使用(%c):则使用字符本身。
按数值使用(%d):则使用该字符的ASCII码值。例如a=‘a’,并不是把字符‘a’本身放到内存单元中,而是将该字符的相应的ASCII码97放到内存单元中。41三、字符型数据在内存中的存储形式及使用方法存储形式:按A四、字符型数据使用方法举例(见P50)例3.6main(){charc1,c2,c3='\007'
;c1='A';c2='B';printf("c1=%c,c2=%c\n",c1,c2);printf("c1=%d,c2=%d\n",c1,c2);printf("c3=%c,c3=%d\n",c3
);}
运行结果如下:c1=A,c2=Bc1=65,c2=66一声响,c3=7但注意:一个字符变量不可以存放一个字符串,所以字符不能用双引号括起来。42四、字符型数据使用方法举例(见P50)例3.6mai例3.7大小写字母的转换#include<stdio.h>main(){charc1,c2;c1=‘a’;c2=‘b’;c1=c1-32;c2=c2-32;printf(“%c%c”,c1,c2);}运行结果:A
B注意字符的相加、字符的运算问题:1.字符型数据和整型数据之间可以通用,可直接进行算术运算.2.对字符数据进行算术运算,相当于对它们的ASCII进行算术运算.3.字符型与数值型可以互相赋值。4.一个字符数据既可以字符形式输出,也可以整数形式输出.43例3.7大小写字母的转换#include<stdio.h1、VC++将字符变量默认定义为signedchar型。其存储单元的最高位为符号位,取值范围是-128~127。2、如果在字符变量中存放一个ASCII码为0~127间的字符,由于字节中最高位为0,因此用%d格式输出字符变量时,是一个正整数。3、如果在字符变量中存放一个ASCII码为128~255间的字符,由于字节中最高位为1,因此用%d格式输出字符变量时,是一个负整数。例如:charc=130;printf(“%d”,c);结果:-126字符按有符号处理例如:unsignedcharc=130;printf(“%d”,c);结果:130字符按无符号处理需要说明:441、VC++将字符变量默认定义为signedchar型。其五、字符串常量字符串常量:一对双引号括起来的字符序列,叫字符串常量,如:“ABCE”、“a”、”A”都是一个字符串常量。注意:(1)字符串常量不能赋给字符变量。(2)字符常量与字符串常量不同。例如:charc1='A';是可以的,但charc1="A";是不合法的。45五、字符串常量字符串常量:一对双引号括起来的字符序列,叫字字符串中的字符按照从左到右的顺序,依次存储在一段连续的空间里,其中每一个字符占用一个字节,其内容为该字符在ASCII码表中对应的数值。注意:C语言的字符串在实际存储时,将自动在字符串尾部加了一个结束标志‘\0’(其ASCII码值为0),但‘\0’不会输出。C语言没有专门的字符串变量。如果需要存储字符串的话,须采用字符数组。试分析:‘a’与”a”相同吗?为什么?提示:输出的结果相同(\0不输出)aa\0字符串在内存的存储形式:46字符串中的字符按照从左到右的顺序,依次存储在一段连续的空间里作业(P66)3.63.73.847作业(P66)3.647总结:常量和变量常量与符号常量
常量是指在程序运行中,其数值不能被改变的量。
常量又可分为直接常量和符号常量。48总结:常量和变量常量与符号常量48120、-100、0;0120、072;0xFFFF、0x1e、0X28AF、0XED4;120L、200L;长整型常量3.14、-3.1、5.12E-6;‘a’、‘#’、‘\n’、‘\101’;099、12f、0xg、48EA;019.5、1e-08;实型常量只能用十进制形式表示,不能用8,16进制表示2.1E10.2、E-6、6.4E+4.8、E9;“changsha”、“+++\\?ab”;字符串常量‘\’、‘\p’、‘’‘、'ab';1、直接常量:是在程序中直接引用的数据。请判断这些常量正确与否?注意‘\’‘√‘\\‘√‘’‘‘\’
\p‘ab’
\到计算机中,都认为是转义字符××××49120、-100、0;1、直接常量:是在2、符号常量是用标识符来表示一个数据;在程序不能再次给它赋值。
定义形式:
#define标识符常量数据例如:#definePI3.14159在程序预处理时,凡是出现标识符PI的地方都将用数据3.14159来替换。如:2*2.3*PI就等价于2*2.3*3.14159。二、变量
变量是指以标识符为名字,其值可以改变的量。
变量代表计算机内存中的某一存储空间,该存储空间中存放的数据就是变量的值。在同一程序块中,变量不能被重复定义。
使用变量时必须“先定义,后使用”。变量三要素:变量名,变量类型,变量值502、符号常量二、变量50存储单元的大小与所表示数值范围的关系存储单元大小无符号数范围 有符号数范围1字节(8位)0~255(28-1)-128~127(-2-7~27-1)2字节(16位)0~65535(216-1)-32768~32767(-2-15~215-1)4字节(32位) 0~(232-1) -231~(231-1)例如:main(){inta,b,c;a=123;b=56;c=a+b;printf("c=%d\n",c);}运行结果:c=179例如:main(){inta,b;shortc;a=32768;b=2;c=a+b;printf("c=%d\n",c);}运行结果:c=-32766如下图:例如:main(){inta,b,c;a=32768;b=2;c=a+b;printf("c=%d\n",c);}运行结果:c=3277051存储单元的大小与所表示数值范围的关系存储单元大小无权值8权值16权值32权值64权值128权值25632770存入整型变量中的情况32770的原码01000000000000010(需要17位)32770的补码01000000000000010(需要17位)取低16位(补码)1000000000000010(16位)反码(补码的低位减1)1000000000000001原码(除符号位按位取反)1111111111111110(-32766)权值32768权值16384权值8192权值4096权值2048权值1024权值512权值2权值2权值416384+8192+4096+2048+1024+512+128+64+32+16+8+4+2=3276652权值8权值16权值32权值64权值128权值25632770八位二进制编码所表示的有符号数二进制数无符号数原码反码补码000000000+0+0+0000000011+1+1+1∶∶∶∶∶∶∶∶∶∶01111111127+127+127+12710000000128-0-127-12810000001129-1-126-127∶∶∶∶∶∶∶∶∶∶11111110254-126-1-211111111255-127-0-153八位二进制编码所表示的有符号数二进制数无符§3.6变量赋值变量的初始化:在定义变量的同时为变量预先设置初值,称为变量的初始化。如:inta=3;floatx=5.89;inta,b,c=8;在定义一个变量时,系统自动根据变量类型分配了存储空间。但是当变量的值即存储在该空间的值并未给出时,其值可能是随机放入其中的垃圾值,所以变量需要预置一个值,即赋值。赋值操作通过赋值符号“=”,把右边的值赋给左边的变量。变量名=表达式例如:a=3;a=a+1;f=3*4+2;a=43*3+b都是合法的赋值形式。43*3+b=a是非法的54§3.6变量赋值变量的初始化:在定义一个变量时§3.6变量赋初值对几个变量赋同一个值,不允许这样赋初值:inta=b=c=8;可以这样:inta=8,b=8,c=8;也可以:inta,b,c;a=b=c=8;注意事项:C语言中,=和==的区别?赋值运算符的结合性为从右至左,其优先级低于算术运算符、关系运算符和逻辑运算符。仅高于逗号运算符。例如:i=j=2+3;注意事项:(1)在C语言中,“=”为赋值运算符号,而不是数学中的”等号”;(2)赋值运算符“=”左边必须是变量名,不能是表达式;(3)赋值运算符“=”两端的类型不一致时,系统将自动进行类型转换。见下页55§3.6变量赋初值对几个变量赋同一个值,不允许这样赋§3.6变量赋值的自动类型转换(参见课本P60)如果赋值时两侧类型不一致时,系统将自动进行类型转换:将整数赋给一个浮点型变量时,系统将保持数值不变并且以浮点小数形式存储到变量中。如floatf;f=12;此时f=12.000000,即先将12转换成12.000000,再存储在f中。将整型12赋给double型变量f,则f=12.0000000000000(补足15位)。将实数赋给一个整型变量时,系统自动舍弃小数部分。如inta;a=3.9;此时以a=3的形式存储在整型变量中。将double型值赋给float型变量,则截取其前面7位有效数字存放。56§3.6变量赋值的自动类型转换(参见课本P60)如果当char型值赋给int型变量时,由于char型数据只占一个字节,而int型占4个字节,则将char型数据放入到int型变量的低8位中,对于int型变量的高8位,不同的系统实现的情况不同,一般当该字符的ASCII值小于127(无论是unsigned还是signed)时,系统将int型变量的高字节置0、低字节存放该字符的ASCII值;例如:intx;x=‘A’;即x=65(00000000
00000000
00000000
01000001).若是signedchar,最高位又为1,或ASCII值大于127,系统将整型变量的高字节全补1,即”符号扩展”。将int、short、long赋给char变量时,只将其低8位原封不动地送到char型变量中。(注意:此时得到的值就不是预想的值)将int赋给long,不需要进行”符号扩展”,可以互相赋值。符号扩展:符号位为0,剩余的高位全补0;符号位为1,剩余的高位全补1。§3.6变量赋值的自动类型转换(参见课本P60)57当char型值赋给int型变量时,由于char型数据只占一个举例:赋值时类型自动转换示例#include<stdio.h>main(){inta,x;floatf;a=3.9;f=12;x=‘A’;printf(“a=%d,f=%f,x=%d\n”,a,f,x);}main(){longa=65535;printf(“a=%ld\n”,a);printf(“a=%u\n”,a);printf(“a=%d\n”,a);}运行结果:
a=65535a=65535a=65535运行结果:
a=3,f=12.000000,x=65思考:将long改为int,结果怎样?58举例:赋值时类型自动转换示例#include<stdio.h§3.7各类数值型数据间的混合运算各数据类型之间是可以进行混合运算的,在进行运算时,不同类型的数据要先转换成同一类型,然后才能进行运算。数据类型的级别:低高intunsignedlongdoublefloatchar,short横向箭头表示必须先转成纵向类型才能进行运算纵向箭头表示当运算对象为不同类型时转换的方向箭头只表示数据类型级别的高级,不是进行一步步转换注意:类型转换是系统自动进行的59§3.7各类数值型数据间的混合运算各数据类型之间是可以进行§3.7各类数值型数据间的混合运算28+32int28+32.5float28+’a’intdouble结果的类型60§3.7各类数值型数据间的混合运算28+32int28+3总结自动类型转换C语言规定,不同类型的数据在参加运算前自动转换成相同类型,再进行运算。转换规则:表达式中只要有float型或double型,自动转换成double型再运算,结果为double型。如果表达式中无float型或double型,但是有long型,数据自动转换成long型再运算,结果为long型。char型和int型运算,先转换为int型,结果为int型。char型、int型和long型运算,先转换为long型,结果为long型。除此之外,只要有float型或double型,自动转换成double型再运算,结果为double型。总而言之:不同类型的数据发生转换时,遵循低级类型向高级类型转换的原则。如:int和double运算,先将int型转换为double型,再进行运算,结果为double型。61总结自动类型转换C语言规定,不同类型的数据在参加运算前自动转#include<stdio.h>main(){floatx,y;longm,n;x=3/2+8/3;y=3.0/2+8/3.0;m=1*2*3*4*5*6*7*8*9;n=1L*2*3*4*5*6*7*8*9;printf(“x=%f,y=%f,m=%ld,n=%ld\n”,x,y,m,n);}运行结果:x=3.000000,y=4.166667,m=362880,n=362880例如:自动类型转换62#include<stdio.h>例如:自动类型转换62回顾前面所讲C语言的类型修饰符:short、int、longsigned、unsignedshort型的存储长度为2个字节,范围-215~215-1。int,longint(简写为long)的存储长度为4个字节,范围-231~231-1,用于存储整数超过shortint型取值范围的情况。signed和unsigned适用于char型、int型和long型三种类型,区别在于它们的最高位是否作为符号位。unsignedchar型取值范围0~255(即0~28-1),unsignedint型和unsignedlong型取值范围(0~232-1)。63回顾前面所讲C语言的类型修饰符:63例如:类型修饰符unsigned的使用#include<stdio.h>main(){chara1,b1;unsignedchara2,b2;a1=127;b1=129;a2=127;b2=129;printf(“a1=%d,a2=%u,b1=%d,b2=%u\n”,a1,a2,b1,b2);}运行结果:a1=127,a2=127,b1=-127,b2=129说明:127的二进制原码是0111111,+129的二进制码是10000001和-127放在存储器里一个字节的形式相同。注意:负数在存储器里是按补码形式存储。(-127)补=(10000001)264例如:类型修饰符unsigned的使用#include<st§3.8运算符和表达式按操作功能运算符大致可分为:算术运算符、关系运算符、逻辑运算符、按位运算符以及其它运算符如赋值运算符、条件运算符、逗号运算符等。表达式是由操作数、运算符及括号组成的序列。算术运算符+-*/%关系运算符><==>=<=!=逻辑运算符!&&‖位运算符《》~|∧&赋值运算符=*=条件运算符?:逗号运算符,指针运算符*和&求字节数运算符sizeof强制类型转换运算符分量运算符•→下标运算符[]65§3.8运算符和表达式按操作功能运算符大致可分为:算术§3.8运算符和表达式教学要求:要求掌握运算符的功能,结合性,优先级。要求掌握数据及运算符组成的表达式的值的判定。要求熟练运用运算符解决实际问题。66§3.8运算符和表达式教学要求:66
C的算术运算符号有三类:
1.基本算术运算符2.强制类型转换运算符
3.自增、自减运算符认识运算符,就要掌握每一种运算符号的功能、优先级、结合性。一、算术运算符和算术表达式67C的算术运算符号有三类:
1.基本算术运算符一1、基本算术运算符基本算术运算符有五个:
+(加)3+4、+3
-(减)3-5、-5*(乘)3*5
/(除)5/2的值为2;5.0/2的值为2.5;只要分母不为0即可
%(求余)5%3的值为2;-5%3的值为-2;5%(-3)的值为2;-5%(-3)的值为-2;结果的符号与被除数一致.12.3%3×若a能被b整除,则写:a%b==0注意事项:
1.当两个整数相除(/)取整数商,结果取整(舍去小数部分),当运算对象有负数时,结果不定,但一般采用“取整后向零靠拢”的方法。
2.“%”运算符号的两侧必须为整数,如果不是整型可采用强制类型转换。例如:5/3=1,-5/3=-1,5/-3=-1,-5/-3=1,2/3=0,5/4=1,2.0/3的结果为0.666667(结果为double型),2.5%3会出错;“/”运算的数据都是整型数据时,结果为整型,如果有实数,结果为double681、基本算术运算符基本算术运算符有五个:例如:5/3=1,
用算术运算符和括号将操作数连接起来的式子,叫算术表达式。
优先级:()*、/、%+、-
结合性:从左至右;(即运算对象先与左面的运算符结合)
表达式的值:数值型(int、long、unsigned、double);例如:已知:floata=2.0;intb=6,c=3;求解:a*b/c-1.5+’a’+fabs(-5)=?2、算术表达式69用算术运算符和括号将操作数连接起来的式子,叫算术表达
doublefloatlongunsignedintchar,short
floata=2.0;intb=6,c=3;
a*b/c-1.5+’a’+fabs(-5)12.0/354.0-1.52.5+97(int)99.5+5104.5(double)思考:a=1.7,b=2.4,计算a+3*-2/(int)(a+b)-12的结果结果:-11.30000070dou二、强制类型转换运算符强制类型转换运算符为单目运算符,使用的形式为:
(类型名)(转换对象)功能:将数据类型进行强制转换,但原来变量类型未变化优先级:仅次于括号类结合性:自右向左注意事项:类型名一定要用括号括起来。例如:(int)(2.5)%3的结果为2;因为%两边必须为整型(float)5/4的结果为1.250000;先将5转换为5.0,再整除(float)2/3的结果为0.666667;先将2转换为2.0,再整除float(2/3)则出错;先整除,结果为0,强制类型转换后,结果为0.000000分析:(int)x+y和(int)(x+y)有区别吗?71二、强制类型转换运算符强制类型转换运算符为单目运算符,使用的强制类型转换最主要的用途满足一些运算符对类型的特殊要求,例如:%运算符,要求两侧的数据为整数,(int)(2.5)%3防止丢失整数除法中的小数部分,例如:intx=3,y=2;floatf;f=(float)x/y;此时f的值为1.500000。如果不用强制类型转换,即f=x/y,结果为1.00000072强制类型转换最主要的用途72三、自增、自减运算符自增、自减运算符主要用于给一个变量加1或减1。自增、自减运算符:单目运算符。运算符:++(自增):如a++,++a,都等价于a=a+1.
--(自减):如a--,--a,都等价于a=a-1功能:使变量的值自增1或自减1自增和自减运算符是单目运算符,放到变量前面:前置方式;放到变量后面:后置方式;这两种方式同样实现了变量的自增和自减运算。但结果是不同的。前置运算时变量先做自增或自减运算,再将变化后的变量值参加整个表达式中的其他运算。后置运算时变量在参加表达式中的其他运算之后,再自增或自减运算。73三、自增、自减运算符自增、自减运算符主要用于给一个变量加1或例如:a=3;b=a++;执行后,b=3,a=4。等价于三条语句:a=3;b=a;a=a+1;而b=++a;执行后,b=4,a=4。等价于三条语句:a=3;a=a+1;b=a;例如:a=3;b=a--;执行后结果是:b=3,a=2。等价于三条语句:a=3;b=a;a=a-1;而b=--a;执行后结果是:b=2,a=2。等价于三条语句:a=3;a=a-1;b=a;例如:a=3;printf(“%d\n”,a++);输出结果为3,输出后a的值为4。例如:a=3;printf(“%d\n”,++a);输出结果为4,输出后a的值为4。74例如:a=3;b=a++;执行后,b=3,a=4。等价于优先级:仅次于括号类,高于算术运算符,而与负值运算符同级,“++”与”--“是同优先级别。++和--的结合性:从右向左,注意:“++”“--”只能用于变量而不能用于常量和表达式。例如:i=2;j=-i++;等价于:j=-(i++);而不能等价于j=(-i)++;即:j=-i;i=i+1;所以j的值为-2,i的值为3。一个变量的前置自增(减)运算和后置增(减)运算仅表明该变量使用其值参加运算与其值自身变化之间的先后关系。即前置时,先自增(减)、后使用。后置时,先使用、后自增(减)。注意“++”或“--”自增与自减运算符的使用。如:设i=3,k=(i++)+(i++)+(i++),k=?如:设i=3,j=4,k=i+++j,k=?提示:C编译系统在处理时尽可能多地(自左至右)将若干个字符组成一个运算符k=9,i=6k=(i++)+ji=4,j=4,k=7三、自增、自减运算符75优先级:仅次于括号类,高于算术运算符,而与负值运算符同级,“#include<stdio.h>main(){inta1,a2,a3,a4,b1,b2,b3,b4;a1=a2=a3=a4=10;b1=(a1++)+(a1++)+(a1++);b2=(++a2)+(++a2)+(++a2);b3=(a3--)+(a3--)+(a3--);b4=(--a4)+(--a4)+(--a4);printf(“a1=%d,a2=%d,b1=%d,b2=%d\n”,a1,a2,b1,b2);printf(“a3=%d,a4=%d,b3=%d,b4=%d\n”,a3,a4,b3,b4);}运行结果:a1=13,a2=13,b1=30,b2=39a3=7,a4=7,b3=30,b4=21三、自增、自减运算符/*先算++,得到a2=13,然后3个a2相加*//*先将3个a1相加得到b1,然后在算++,得到a1*/调试程序一般像i+++++i,++j+++j这些undefinedbehavior,还是避免的好,不要依赖特定编译器的实现。结果与编译器有关,没必要太深入研究,只要知道左结合和右结合是怎么回事就行了。
注意:76#include<stdio.h>三、自增、自减运算符/*先§3.9赋值运算符和赋值表达式赋值运算符:=功能:将数据赋给一个变量。优先级:仅优先于逗号运算符。结合性:自右向左注意事项:
赋值运算符号不等于数学中的“等号”。例如:a=3将常量3赋给变量a;a=43*3+b将赋值号右边表达式计算结果赋给变量a而:43*3+b=a是非法的77§3.9赋值运算符和赋值表达式赋值运算符:=例如:§3.9赋值运算符和赋值表达式复合赋值运算符:由算术运算符“+-*/%”和赋值运算符“=”的结合组成。+=:加赋值运算符。如:a+=3+1,等价于a=a+(3+1)。-=:减赋值运算符。如:a-=3+1,等价于a=a-(3+1)。*=:乘赋值运算符。如:a*=3+1,等价于a=a*(3+1)。/=:乘赋值运算符。如:a/=3+1,等价于a=a/(3+1)。%=:取余赋值运算符。如:a%=3+1,等价于a=a%(3+1)功能:先将符合运算符右边表达式的结果与左边的变量进行算术运算,然后再将最终结果赋予左边的变量。
1.复合赋值运算符是一个运算符,但功能上,是两个运算符功能的组合。2.复合运算符左边必须是变量;3.复合运算符右边的表达式计算完成后才参与符合运算符。优先级:等同于简单的赋值运算符“=”,仅优先于逗号运算符。结合性:自右至左。注意:78§3.9赋值运算符和赋值表达式复合赋值运算符:由算术运§3.9赋值运算符和赋值表达式如:a=5;a*=3;与a=a*3等价。如:a/=43*3与a=a/(43*3)是等价的。如:x%=y+3与x=x%(y+3)等价,而不是x%y+3。举例:#include<stdio.h>voidmain(){inta=10,b=10;printf(“%d\t”,a+=a-=a*a);printf(“%d”,b+=b-=b*=b);}复合运算符常用于某个变量自身的变化,尤其当左边的变量名很长时,使用符合运算符书写更方便。举一反三:计算a=3时,表达式a*=4+(a%=2)的结果。运行结果:5调试程序运行结果:-180079§3.9赋值运算符和赋值表达式如:a=5;a*=3;§3.9赋值运算符和赋值表达式赋值表达式:用赋值运算符号将一个变量和一个表达式连接起来的式子叫做赋值表达式。格式:<变量><赋值运算符><表达式>求解过程:先求赋值运算符右侧的“表达式”的值,然后赋给赋值运算符左侧的变量。注意事项:赋值表达式与赋值语句不同。如:a=b=c=5表达式值为5,a、b、c值均为5a=5+(c=6)表达式值为11,a=11,c=6a=(b=10)/(c=2)表达式值为5,a=5,b=10,c=2请分析:设a=12,计算表达式a+=a-=a*a和a+=a-=a*=12的值-264080§3.9赋值运算符和赋值表达式赋值表达式:用赋值运算符§3.10逗号运算符和逗号表达式逗号运算符:,这是一个多目运算符逗号运算符主要用于连接两个或多个表达式。例:a=a+1,b=3*4;形式:逗号表达式1,逗号表达式2,…,逗号表达式n功能:依次求解各个表达式的值。求值规则:从左至右依次计算各表达式的值;优先级:级别最低结合性:自左向右注意事项:逗号表达式的值就是逗号表达式中最后一个表达式的值例如:d=(a=3,b=5,c=a+b,c+2,a++)等价于a=3;b=5;c=a+b;c+2;a++
依次进行逗号表达式中各表达式的运算,整个逗号表达式的值是,计算结束后变量a、b、c、d的值分别是3458381§3.10逗号运算符和逗号表达式逗号运算符:,这是一例如:aby表达式y=a=4,b=5,a+b;4549y=(a=4,b=5,a+b);4599y=(a=4,b=5),a+b;4559y=a=(4,b=5),a+b;55510注意:
C语言常用逗号作为分隔符,例如:inta=3,b=4,c=5;printf(“%d,%d,%d”,(a,b,c));×
printf(“%d,%d,%d”,a,(a,b,c),c);结果为3,5,5举一反三:判断输出结果printf(“%d,%d\n”,(3,4,5),(a=3,a=0,a+=2));运行结果:5,282例如:运行结果:5,282作业:重点熟悉C语言上机环境,然后调试程序。1、课本P673.9(1)(2)要求:请调试后,将问题写在纸张上,如果没有问题,可自己打√后上交,每个班交一半作业。2、课本P673.10自己先运行,然后上机调试。3、实验指导书:实验一:思考题调试完成后,将结果写在实验指导书上,同时提交网上的实验报告。另外,将实验内容中的题调试5个通过网上提交。83作业:重点熟悉C语言上机环境,然后调试程序。83第三章数据类型、运算符和表达式主要内容:C语言的数据类型常量与变量整型数据浮点型数据字符型数据变量赋初值各类数值型数据间的混合运算算术运算符和算术表达式赋值运算符和赋值表达式逗号运算符和逗号表达式84第三章数据类型、运算符和表达式主要内容:1§3.1C语言的数据类型计算:3*2数值型数据在屏幕上显示“我是河科人"字符串常量到"203"房间找某人指针型数据学号为101-103的全体学生数组型数据算法处理的对象是数据,数据是数据的组织形式即数据结构。不同的数据之间往往存在某些联系。不同的计算机语言使用的数据结构是不相同的。所以,处理同一类问题,如果数据结构不同,算法也会不同。因此,在程序设计时,应综合考虑算法和数据结构。选择最佳的数据结构和算法。回顾第二章:问题的提出:85§3.1C语言的数据类型计算:3*2§3.1C的数据类型数据类型基本类型构造类型指针类型空类型数值型字符型枚举类型整型数据实型(浮点)数据单精度型双精度型数组类型结构体类型共用体类型所有的数据,在进行处理时都需要先存放进计算机的内存中,所以了解不同的数据在计算机中存储的形式是很重要的。86§3.1C的数据类型数据类型基本类型构造类型指针类型空类§3.2常量与变量在程序设计中,我们不仅使用到常量,如:123,-90,0.125等,而且我们更多地还要使用变量,因为它们的值在程序的运行中是可以改变的。本节内容需要了解常量及变量的概念、变量的命名规则。87§3.2常量与变量在程序设计中,我们不仅使用到常量,如C语言字符集1、英文字母:大小写各26个,共计52个;2、阿拉伯数:0~
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 小学生消防演练课
- 超星食品安全组日常饮食
- 部编版八年级地理上册第三章第一节《自然资源的基本特征》课件
- 放射性皮炎的护理重点
- 1.1 物质结构研究的内容课件高二上学期化学苏教版(2019)选择性必修第二册
- 彩虹教案反思
- 虎和兔说课稿
- 函数的说课稿
- 产科科室护理一级质控
- 被针刺伤应急演练
- 家乡介绍山东日照概述课件
- 基于Android的天气预报系统的设计与实现
- 企业和银行合作情况报告
- (完整)中医症候积分量表
- 小学奥数 等量代换(含答案)
- 小学科学教师基本功大赛试题汇总
- 武汉理工大学土力学与基础工程(新)考试答案
- 《叙事疗法案例》课件
- 物联网技术在军事上的应用与现代战争教案
- 科技畅想未来主题班会 课件
- 《员工心理健康》课件
评论
0/150
提交评论