版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第二章C语言数据类型与基本操作2本章主要内容1、常量和变量2、标识符与关键字3、整型数在计算机中的存储方式4、有符号的数据类型和无符号的数据类型5、运算符及表达式6、不同类型数据间的转换数据类型构造类型指针类型空类型char(字符类型)enum(枚举类型)整型实型float(单精度)double(双精度)shortint(短整型)longint(长整型)int
(整型)数组类型结构类型共同类型基本类型数值类型文件类型C语言的数据类型
数据类型决定:1.数据占内存字节数2.数据取值范围3.其上可进行的操作42.1.1常量2.1常量与变量在程序运行过程中,其值不改变的量称为常量。在C语言中,常量有不同的类型:整型常量(int)短整型(shortint)长整型(longint)无符号型(unsignedint)实型常量(float和double)字符常量(char)字符串常量51.整型常量十进制常量如15,19,123,-345等。八进制常量以数字0开头如:05,012,0123十六进制常量以数字0和字母x(或大写字母X)开头如:0x10,0Xff,0X8十进制5,10,83十进制数16,255,862.实型常量用小数形式表示如:345,.345,345.0,3.14159指数形式表示1.5e5,2.9e-71.5×105,2.9×10-7。注意:指数形式的浮点常量E或e前面必须有数字,E或e后面必须为整数。73.字符常量用一对单撇号括起来的一个字符如'a','A','?','#'单撇号只是字符与其他部分的分隔符/定界符,不是字符常量的一部分。不能用双引号代替撇号,如"a"不是字符常量。字符型常量:
它是用一对单撇号括起来的一个字符如'a','A','?','#'等
转义字符
有些字符和命令无法通过键盘直接输入,因而借用一个符号或者数字来表示,C语言用反斜杠“\”来表示转义字符的起始符,转义字符的表示有三个方面:
①用反斜杠开头后面跟一个字母代表一个控制字符;
\n\t\r\b——回车换行
——回车不换行
——退格
——水平跳格
②\\代表\字符,用\'代表'字符。③用“\”后跟1到3个八进制数代表ASCII码为该八进制数的字符;用“\x”后跟1~2个十六进制数代表ASCII码为该十六进制数的字符。\101或\x41表示'A'\363或\xf3表示≤\012或\x1A表示→\100或\x40表示@【例1】打印人民币符号¥简称字符printf("Y\b=");9例2.2
main(){charch;ch='\362';printf("%c\n",ch);printf("china\n\101\t\\\n");}运行结果:屏幕显示:≥chinaA\105.字符串常量"hello“"ProgramminginC““A”“a”"“把用一对双撇号括起来的零个或多个字符序列称为字符串常量。字符串以双撇号为定界符,但双撇号并不属于字符串。要在字符串插入撇号,应借助转义字符。要处理字符串"Isay:'Goodbye!'"时,可以把它写为"Isay:\'Goodbye!\'"。字符串常量字符串中的字符数称为该字符串的长度。字符串常量在机器内存储时,系统自动在字符串的末尾加一个“字符串结束标志”,它是转义字符“\0”。
hello\0例字符串''hello''在内存中例空串''''\01041011081081110注:字符与字符串的区别.aa\0例
'a'''a''126.符号常量【例2.3】符号常量举例#definePRICE30main(){intnum,total;num=10;total=num*PRICE;printf("total=%d",total);}运行结果:total=300
定义:用一个标识符代表一个常量
#define
标识符
代表的常量使用符号常量的好处是:(1)含义清楚。(2)在需要改变一个常量时能做到“一改全改”。
常用大写字母,与变量名区分开来。变量
变量是指在程序的运行过程中,其值可以发生变化的量声明变量的目的:(1)存放需要加工的初始值(2)存放加工的中间结果(3)存放加工的最终结果需要理解的三个概念变量名、变量的存储空间、变量的值inta=3;1101afff地址表示存储空间a变量名3变量的值141.变量的声明变量声明的格式为:数据类型符变量名1,变量2,……,变量名n;例如:intx;inty;或等效为:intx,y;注意:①定义变量的语句必须以“;”号结束,在定义一个语句中也可以同时定义多个变量,变量之间用“,”隔开。②对变量的定义可以在函数体之外,也可以在函数体或复合语句中。152.变量的初始化C语言允许在说明变量的同时对其初始化,intsum=0;/*说明变量sum的类型为整型,初始值为0*/floatpi=3.1416;charc='w';【例2.4】整型变量的定义和引用。#include"stdio.h"main(){intx,y,z,s; /*基本整型变量定义,一次可定义一个或多个变量*/x=3;y=4;z=5; /*整型变量的引用*/s=x+y+z; /*整型变量的引用*/printf("\ns=%d",s);}运行结果:S=12注意:(1)不同类型的数据在内存中占据不同长度的存储区,而且采用不同的表示方式。(2)一种数据类型对应着一个值的范围。(3)一种数据类型对应着一组允许的操作。162.2
标识符和关键字-标识符一个标识符可由字母、数字和下划线组成;必须用字母或下划线开头;大小写要区分
;不能用保留关键字作变量名;避免混淆的字母;例如:l
与
I,o
与0……..例:判断下列标识符号合法性sumSumM.D.JohndayDate3daysstudent_name#33lotus_1_2_3chara>b_above$1231732个关键字:(由系统预定义,具有固定定义,不能另作定义)autobreakcasecharconstcontinuedefaultdodoubleelseenumexternfloatforgotoifintlongregisterreturnshortsignedsizeofstaticstructswitchtypedefunsignedunionvoidvolatilewhile-关键字182.3整型数在计算机中的存储方式计算机系统的内存储器,是由许多称为字节的单元组成的,1个字节由8个二进制位(bit)构成,每位的取值为0/1。最右端的那1位称为“最低位”,编号为0;最左端的那1位称为“最高位”,而且从最低位到最高位顺序,依次编号。
原码、反码和补码的相关知识计算机中,所有的整数都是以补码的形式进行存储的正整数的原码、反码和补码相同求负整数的补码步骤如下:(1)求负整数的原码(2)在原码的基础上求反码(3)在反码的基础上加1原码
5的八位二进制的原码为00000101-5绝对值的八位二进制表示为00000101正整数的原码是这个数本身。负整数的原码求解方法:负整数的绝对值用二进制表示,最高位用于表示符号,1表示负整数,0表示正整数。求-5的原码:10000101-5原码的八位二进制表示:求5的原码:反码
反码表示法规定:正整数的反码和原码相同负整数数的反码是对该数的原码除符号位外各位取反求5的反码:5的反码的八位二进制为00000101求-5的反码:-5的原码的八位二进制表示为10000101-5的反码的八位二进制表示为11111010补码
补码表示法规定:正整数的补码和原码相同负整数的补码是在该数的反码的基础上加1,即最后(即最右边)一位上加1。求5的补码:5的补码的八位二进制为00000101求-5的补码:-5的反码的八位二进制表示为11111010-5的补码的八位二进制表示为11111011
C语言中所有的整数都是以补码的方式存储的例:求-50在内存中的存储结果(假定用16位来存储)。-50绝对值的原码:0000000000110010-50的原码:1000000000110010-50的反码:1111111111001101-50的补码:1111111111001110例:把内存中以补码形式存储的数据1111111111110110转化为十进制整数。数据的补码表示:1111111111110110除符号位外,各位取反:1000000000001001最低位加1:1000000000001010-10例:把内存中以补码形式存储的数据1111111111110110转化为十进制整数。数据的补码表示:1111111111110110除符号位外,各位取反:1000000000001001最低位加1:1000000000001010-10262.4有符号的数据类型和无符号的数据类型类型类型标识符所占字节数取值范围及精度字符型[signed]char1-128~+127unsignedchar10~255整型[signed]int4-214783648~+214783647[signed]short[int]2-32768~+32767[signed]long[int]4-214783648~+214783647unsignedint40~4294967295unsignedshort[int]20~65535unsignedlong[int]40~4294967295实型float4-3.4×10-38~3.4×1038,6~7位有效数字double8-1.7×10-308~1.7×10308,15~16位有效数字longdouble16-1.2×10-4932~1.7×104932,18~19位有效数字272.5
运算符及表达式
算术运算符:+-*/%++--关系运算符:<<===>>=!=逻辑运算符:!&&||位运算符:<<>>~|^&赋值运算符:
=+=-=
条件运算符:
?:逗号运算符:
,地址运算符:*&求字节数运算符:
sizeof强制类型转换:(type-name)分量运算符:
.->下标运算符:[]其他:()-282.5.1赋值运算符和赋值表达式1.赋值运算符与赋值表达式“=”就是赋值运算符。赋值表达式:由赋值运算符组成的表达式称为赋值表达式。它的一般形式:<变量>=<表达式>如:x=5;赋值表达式的求解过程:将赋值运算符右侧的表达式的值赋给左侧的变量。赋值的含义是将赋值运算符右边的表达式的值存放到左边变量名标识的存储单元中。29说明:(1)赋值运算符左边必须是变量,右边可以是常量、变量、函数调用或由常量、变量、函数调用组成的表达式。例如:x=10,y=x+10,y=func()都是合法的赋值表达式,12=a,2*a=3*5+55都不是合法的赋值表达式。(2)赋值符号“=”不同于数学的等号,它没有相等的含义,“==”才表示相等。例如:C语言中x=x+1是合法的,而数学上不合法。(3)赋值运算时,当赋值运算符两边的数据类型不同时,将由系统自动进行类型转换。转换原则是:先将赋值号右边表达式的类型转换为左边变量的类型,然后赋值。赋值运算符的优先级仅仅高于逗号运算符,具有自右向左的结合性。应用举例
【例2.8】有语句inta=2,b=5,x,y;执行x=y=a+b;后x,y的值。abxy2577【例2.9】有定义:inta,b,c;求执行表达式a=(b=65)/(c=6);后a的值。abc65610复合赋值运算符a=b+a=a+b相当于a=a-ba-=ba*=ba=a*ba/=ba=a/ba%=ba=a%b相当于相当于相当于相当于y*=a+b;y=y*(a+b)相当于【例2.10】有定义:inta=6,b=8;求执行a*=b+=12后,a的值。a6b8b+=12b=b+1220a*=ba=a*b120
复合赋值运算符【例2.11】有定义:“inta=12;”,执行表达式a+=a-=a*=a后,a的值为()。A.12 B.144 C.0D.132a*=aa12a=a*a144a-=aa=a-a0a+=aa=a+a0332.5.2算术运算符和算术表达式算术运算符包括:+(加),-(减),*(乘),/(除),%(取余),++(增1运算符或称自增运算符),--(减1运算符或称自减运算符)。双目运算符的两个操作数类型可以不同,运算前遵循类型的一般算术转换规则自动转换成相同的类型,运算结果的类型与转换后操作数的类型相同。类型的一般算术转换规则的基本原则是值域较窄的类型向较宽的类型转换。
算术运算符和算术表达式算术运算符包括:+,-,*,/,%,++,--左操作数右操作数运算符13+513.0+5结果为整数18结果为浮点数18.0'd'–97结果为整数31/2 结果为整数01.0/2结果为浮点数0.55%10结果为整数510%5结果为整数01/2.01.0/2.0自增、自减运算符
++
自增运算符,其作用是使变量的值自加1
--自减运算符,其作用是使变量的值自减1
++i,--i前缀运算:在使用i之前,先使i的值自增(或自减)1
i++,i--后缀运算:在使用i之后,再使i的值自增(或自减)1
【例】有定义:inti=8,j;求执行j=i++;后i,j的值i8j89【例】有定义:inti=8,j;求执行j=++i;后i,j的值ij899应用举例【例2.12】假设变量i,j,k的值分别为3,5和3,求执行表达式“m=(++k)*j;”和“n=(i++)*j;”中的m和n的值。ijkmn353420154应用举例习题1、下列算术运算符中,只能用于整型数据的是()。A.-B.+C./D.%习题2、假设有以下变量定义:intk=7,x=12;则能使值为3的表达式是()A.x%=(k%=5)B.x%=(x-k%5)C.x%=k+k%5D.(k%=5)–(x%=k)D20C2382.5.3长度测试运算符sizeof长度测试运算符sizeof可用来测试某个类型的变量所占用计算机内存空间的字节长度。格式为:sizeof(类型名)例:main(){printf("char:%dbytes\n",sizeof(char));printf("short:%dbytes\n",sizeof(short));printf("int:%dbytes\n",sizeof(int));printf("long:%dbytes\n",sizeof(long));printf("float:%dbytes\n",sizeof(float));printf("double:%dbytes\n",sizeof(double));return0;}392.5.4关系运算符和关系表达式1.关系运算符关系运算实际上就是比较运算,即比较两个运算对象值的大小。符号优先级<(小于),>(大于),<=(小于或等于),>=(大于或等于)高==(等于),!=(不等于)低注意:
(1)关系运算符为双目运算符,结合方向为自左至右。(2)关系运算符的结果为真(1)或假(0),C语言中没有逻辑值。(3)算术运算符高于关系运算符。402.关系表达式由关系运算符、运算对象以及小括号组成的表达式称为关系表达式。当表达式成立时,返回值为整型值1;当表达式不成立时,返回值为整型值0。c>a+b等同于c>(a+b)a=b>c等同于a=(b>c)a>b!=c等同于(a>b)!=c【例2.14】请注意下列给出的表达式及其返回值。①6<8的返回值是非零(1)。②3>5的返回值是0。③若a=3,b=5,则a>=3+10的返回值是0。④若x=90,则x<=100的返回值是1。⑤若x=10,y=15,则x+y==25的返回值是1。⑥若z=36,则z!=36的返回值是0。【例2.15】下列程序运行后的结果为()。main(){ intx; x=10>5>3; printf("%d\n",x);}0【例2.16】已知a=3,b=2,c=1,则表达式a>b==c的值为()。1对于关系表达式要注意如下事项:⑴一个关系式中含有多个关系表达式时,要注意与数学式的区别。⑵应避免对实数作相等或不等的判断,因为实数在内中存放时有一定的误差。
逻辑运算符与逻辑表达式&&
||
!
逻辑运算符:用逻辑运算符将关系表达式连接起来就构成逻辑表达式。逻辑表达式:
【例2.17】分析逻辑表达式!(5>3)&&(2<4)的值。a&&b同真则真a||b有真则真!a取反面!(5>3)!(1)0逻辑表达式的运算结果:1(“真”),0(“假”)a&&b
x||y
!z
逻辑表达式具有唯一真值的变量2、逻辑运算符与逻辑表达式C语言逻辑表达式的特性:在计算逻辑表达式时,只有在必需执行下一个表达式才能求解时,才求该表达式。
⑴逻辑与(&&)运算表达式中,只要前面一个表达式被判定为“假”,系统不再判定其后的表达式,整个表达式的值为0。a++&&b++
⑵逻辑或(||)运算表达式中,只要前面一个表达式被判定为“真”,系统不再判定或求解其后的表达式,整个表达式的值为1。a=0,b=0a++||b++
a=1,b=1【例2.19】定义:
inti=10,s=0;执行下列语句s=++s||++i;后s和i的值是多少?i10s0143【例2.18】已知year为整型变量,不能使表达式(year%4==0&&year%100!=0)||(year%400==0)的值为“真”的数据是()。A.1990 B.1992 C.1996 D.2000A【例2.19】定义:“inti=10,s=0;”,分别执行下列语句,s和i的值是多少?s=++s||++i;答案为:s=1,i=10【例2.20】定义:“intx=0,y=0,z=0;”,分别执行下列语句后,各变量的值是多少?++x&&++y||++z答案为:x=1,y=1,z=0
应用举例已知A,B,C,D四人中有一个人是小偷,并且,这四个人中每个人要么说真话,要么说假话。在审讯过程中,这四个人分别回答如下:A说:B没有偷,是D偷的。B说:我没有偷,是C偷的。C说:A没有偷,是B偷的。D说:我没有偷。现要求根据这四个人的回答,写出能确定谁是小偷的条件。inta,b,c,d;b+d==1真b+d==1假b+d==1b+cb+ca+ba+bb+c==1b+c==1a+b+c+da+b+c+da+b+c+d==1&&&&&&b+d01==1b+d10==1==1==1==1==1==1==1452.5.6条件运算符与条件运算表达式条件运算符“?:”是C语言提供的惟一一个三目运算符。条件运算表达式的一般格式为:表达式1?表达式2:表达式3【例2.20】从键盘读入一个整数赋给x,如果x大于等于0,把x的平方赋给y,否则把x的2倍赋给y。#include"stdio.h"voidmain(){ intx,y; scanf("%d",&x); y=x>=0?x*x:2*x; printf("y=%d\n",y);}【例2.21】已定义“intx=4,b=5,y;”,执行语句:y=++x>b?x:b-->++x?++b:x后,x、b、y的值分别为_______。答案为x=6,b=4,y=6【例2.24】分析下列程序的输出结果。#include"stdio.h"voidmain(){inti,j,k,a=3,b=2;i=(--a==b++)?--a:++b;j=a++;k=++b;printf("i=%d,j=%d,k=%d\n",i,j,k);}i=1,j=1,k=4【例2.25】请编制程序,任意输入两个整数,输出其中较小者。
main(){intn1,n2,min;clrscr();printf("inputtwonumber(n1,n2):");scanf("%d,%d",&n1,&n2);min=(n1>n2)?n2:n1;printf("min=%d",min);}运行时,按屏幕提示操作:inputtwonumber(n1,n2):3,5↙结果为:min=3【例2.26】编制程序,输入大写字母,则输出小写字母;输入小写字母,则输出大写字母。main(){charch;printf("inputanyletter:");scanf("%c",&ch);ch=((ch>='A')&&(ch<='z'))?ch+32:ch-32;printf("output:%c\n",ch);}运行时,按屏幕提示操作:inputanyletter:G↙结果为:output:g再运行:inputanyletter:e↙则结果为:output:E应用举例例2.23、已定义“intx=4,b=5,y;”,执行语句:y=++x>b?x:b-->++x?++b:x后,x、b、y的值分别为_______。xyb45554666习题:找出三个整形数据的最大数inta,b,c;scanf("%d%d%d",&a,&b,&c);,maxa>b?a:b;(a>c?a:c)(b>c?b:c)max=472.5.7逗号运算符与逗号表达式逗号运算符,又称“顺序求值运算符”。逗号表达式的一般形式为:表达式1,表达式2或表达式1,表达式2,表达式3,…,表达式n;运算过程是:自左至右依次计算表达式1,表达式2,…,表达式n的值,而整个逗号表达式的值取最后的表达式n的值。【例2.27】分析下列逗号表达式的计算过程及结果。①3+5,6*3 表达式的值是18。②a=(3+5,6*3) a的值是18,此为赋值表达式。③a=3+5,6*3 a的值是8,表达式的值是18(先作赋值运算)。④a=3+5,6*a a的值是8,表达式的值是48。⑤(a=3+5,6*a),a+100 a的值是8,表达式的值是108。使用逗号表达式应该注意如下事项:⑴逗号表达式可以和另外一个表达式组成一个新的逗号表达式。⑵并不是在所有出现逗号的地方都组成逗号表达式。如在变量说明中和函数参数表中的逗号只是用做个变量之间的间隔符。482.5.7逗号运算符与逗号表达式【例2.27】下面是给字符变量赋值的六种方式,仔细体会字符数据的表示方法和逗号表达式的用法。#include"stdio.h"main(){charc1,c2,c3,c4,c5,c6;c1='A',c2='\x41',c3='\101',c4=65,c5=0x41,c6=0101;printf("%c,%c,%c,%c,%c,%c\n",c1,c2,c3,c4,c5,c6);printf("%d,%d,%d,%d,%d,%d\n",c1,c2,c3,c4,c5,c6);return0;}492.5.8位运算位运算的作用是对运算对象按照二进制位进行操作的运算;它能够对字节或字中的实际位进行检测、设置或位移;它运算的对象只能是字符型或整型变量以及它们的变体,对其他类型的数据不适用。501.位运算符位运算符还可以与赋值运算符相结合,成为位运算赋值操作。运算符作用举例等价表达式<<=左移赋值a<<=na=a<<n>>=右移赋值b>>=nb=b>>n&=位与赋值a&=ba=a&b=位异或赋值=bb|=位或赋值a|=ba=a|b512.位运算的功能(1)按位取反(~)。~是单目运算符,用来对一个二进制数按位取反,也就是说将原来的0变为1,1变为0。【例2.25】分析下列程序的输出结果。voidmain(){unsignedchara,b;a=0x9a;b=~a;printf("a:%xb:%x\n",a,b);}运行结果为:a:9ab:6552(2)按位与(&)。参加运算的两个数据,按照二进制位进行“&”运算,如果两个相应的二进制位都为1,则该位的结果为1,否则为0。即0&0=0,0&1=0,1&0=0,1&1=1。按位与有以下功能:1)清0。如果想将一个单元清0,即使全部二进制位为0,只要找一个二进制数,其中的各位符合以下条件:原来的数中为1的位,新数中的相应位为0。然后将二者进行&运算,可以达到清0的目的。也就是原数取反,再和原数进行按位与,就可以达到清0的目的。【例2.26】分析下列程序的运行结果。voidmain(){intx;x=x&~x;printf("%d\n",x);}解析:假如x的值为00101011,~x后为11010100,则
00101011
& 11010100 000000002)取一个数中的某些指定位。如果有一个整数a(2个字节),想要其中的低字节,只需要将a与377按位与即可。53(3)按位或(|)。两个相或的二进制位中只要有一个为1,该位或的结果就为1,即:0|0=0,0|1=1,1|0=1,1|1=1。“按位或”常用来将某一个数据的某些特点位置置1。如:a是一个整数(16位),表达式a|0377使得低8位全置1,高8位保留原样。【例2.27】分析下列程序的输出结果。#include"stdio.h"voidmain(){charx;x='B';x=x|0x80;printf("%d\n",x);} 解析:字符'B'的二进制码为01000010,经过运算x=x|0x80后,x的值为11000010,由于它是补码存储,以十进制数输出结果为-62。54按位异或()。异或运算符也称XOR运算符。它的作用是判断两个相应位的值是否“相异”(不同),若相异则结果为1(真),否则为0。即:00=0,01=1,10=1,11=0。按位异或有以下应用:1)使特定位翻
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 浏阳市人民医院2025年公开招聘编外合同制人员备考题库及参考答案详解1套
- 湖南省株洲市2023-2024学年九年级上学期期末考试物理试卷(含答案)
- 2026年住宅装修设计合同
- 2025年第十三师中级人民法院聘用制书记员招聘备考题库及1套参考答案详解
- 中国人民银行所属企业网联清算有限公司2026年度校园招聘26人备考题库及参考答案详解
- 2026年科技成果评估作价入股合同
- 2025年招商银行佛山分行社会招聘备考题库及1套参考答案详解
- 2025年青岛市李沧区人民法院公开招聘司法辅助人员备考题库及答案详解1套
- 长沙市望城区人民医院2025年面向社会公开招聘编外合同制专业技术人员备考题库及1套完整答案详解
- 青岛日报社招聘事业单位工作人员笔试真题2024
- 计算思维与人工智能 课件 第8章 智能图像处理
- 2025年全屋定制合同协议装修材料品牌选择指南
- 探索丝绸之路课件
- 2025秋季国开《经济学(本)》期末考试题库及答案
- (新教材)2026年人教版八年级下册数学 24.3 数据的四分位数 课件
- 戥秤的课件教学课件
- 砂石赠与合同范本
- 五常管理餐饮培训
- (12)普通高中技术与工程课程标准日常修订版(2017年版2025年修订)
- 大型船舶建造设施项目船坞及码头工程施工组织设计
- GB/T 20469-2006临床实验室设计总则
评论
0/150
提交评论