第2章基本数据类型和运算学习和解题要点1.数据类型C语言中的数据类型比别的语言丰富。要学好这部分内容,首先要掌握C语言的数据在内存中的表示。整型数据:以二进制的形式表示(1)int类型正数:如123(+123)用16位二进制(二个字节)表示原码反码(原码同)补码(原码同)最大正整数215-1=214+213+212+211+210+29+2827+26+25+24+23+22+21+20=32767负数:如–123原码反码(符号位不动,其它取反)补码(补码加1)已知补码求原负数符号位不动,其它取反加1取反加1最大负整数-215=32768因为-215-(215-1)所以用-215而不用-(215-1)(2)unsigned(int)类型称为无符号整数,它不是指不带“+或-”号的整数,而是指内存表示这类数时没有符号位,16位二进制都用来表示数,因此最大数215+214+213+212+211+210+29+2827+26+25+24+23+22+21+20=65535最小数0(3)long(int)类型用32位二进制(四个字节)表示,其他同int型(4)short类型有的计算机(小型、中型、大型机)int即是long,而short用16位二进制(二个字节)表示。因此C语言中,short一定是短整型,long一定是长整型,而int因不同的系统而不同。PC586机int即short,所以一般不用short。(5)在C语言中,整型常量有三种形式的写法:十进制整数(0-9)表示。通常整数的写法。八进制整数(0-7)表示。在整数的前面加数字0。十六进制整数(0-f)表示。在整数的前面加0x。长整型常量表示方法:在整数的后面加L或l。00000000011110110000000001111011符号位0表示正000000000111101101111111111111111000000001111011符号位1表示负1111111110000100111111111000010110000000011110101000000001111011111111111111111111111111111111110000000000000000字符型数据:以二进制的形式表示char型用8位二进制(一个字节)表示如‘a’,在程序中要用单引号表示,输出时无单引号,内存中表示为26+25+20=97即ASCII码97实型数据:以二进制的形式表示(1)float类型如123.45(+123.45)用32位二进制(四个字节)表示为0.12345×103不同的系统,n的位数有不同,n长,精度高,但可表示的指数小,能表示的数的范围小。反之,则能表示的数的范围大,但精度低。float类型又称为“浮点”类型,把实数的小数点都看成在第一位,而用指数位“浮动”小数点。(2)double类型与float同只不过用64位二进制(八个字节)表示。因此精度高,称双精度。2.变量的概念C语言中的变量可以理解成计算机内存的一个空间,它必须有一个名字(标识符),可放什么样的数据类型(如定义时前面加int、float、char等),它是开辟在内存的一般数据区(又称静态数据区)还是开辟在内存的堆栈区(又称动态数据区),这可由程序中用static或auto(可缺省)来规定。同时,一个变量有它的有效的使用范围,称之为作用域。最后,每个变量都有地址,这在指针类型时要用到。变量可以一边定义一边赋初值,在程序运行时可以使它发生变化,因此称之为变量。3.运算符的注意事项(1)双目运算符%的两边一定是要整数,运算结果是整除后的余数,也是整数,注意2%5得2而不是0。(2)双目运算符/的两边如果是整数,则结果也是整数,5/2结果为2而不是2.5,即使是floatx;x=1/2;x中也只有0.0,要人为的写成x=1/2.0或x=1.0/2,x中才是0.5。(3)单目运算符++--放在运算对象的前面时,称为“先加(减)1,后使用”,这一般不会搞错。当放在运算对象的后面时,称为“先使用,后加(减)1”,这时要注意什么时候“使用”。如i=3;(i++)+(i++)+(i++)结果是9而不是12,这里,三个i相加是“使用”,使用后才三次加1,i成为6,“使用”是以整个表达式为准。而i=3;(++i)+(++i)+(++i)结果是18而不是15,这里,三个i依次加1成为6,然后再“使用”。也是以整个表达式为准。又如i=1;if(i--)printf(“%d”,i);输出是0而不是1。这是因为if()中i--是整个表达式,先用i为1,用于“判断”成立,这算“使用”了,然后i减1成为0,输出时i已为0。同理charc=’A’;switch(c++){case‘A’:printf(“%c”,c);break;………},输出为B。01100001本00.12345的二进制表示03的二进制表示数符小数部分指数符指数+0.12345+10332位32-n位n位(4).算术自反赋值运算符中,注意=赋值号右边是一个整体,如c%=a-3是c=c%(a-3)而不是c=c%a-3。(5).关系运算符中,注意等于比较运算符“==”与赋值运算符“=”容易疏忽,二者是绝然不同的,不然会引起很大的错误。如:i=0;if(i==1)判断得结果应该是不成立,若写成:if(i=1)则变成给i赋予1,赋值表达式的结果也是1,判断结果是成立的。(6).应该熟记运算符及其优先级汇总表,熟记运算符之间的运算次序及结合方向。4.表达式注意的问题(1).在算术表达式中应注意各类数值型数据间的混合运算问题,如下:doublefloatfloat型一定先转换成double型参加运算。long运算对象不同时转换方向。unsignedintchar,shortchar,short型一定先转换成int型参加运算。(2).C语言无“真假值”,判断成立则结果为1,不成立则结果为0。而当表达式的值为非0则认为“真”,当表达式的值为0则认为“假”。(3).关系表达式中,数学上的0x10不能写成0x10而应写成0x&&x10,不然会引起很大的错误。如:当x=20时,数学上0x10是不符合的,但在C程序中认为成立。这是因为C程序从左向右判别,0x成立,则结果为1,110也成立。(4).在“&&”连接的逻辑表达式中,当左边表达式的值为0,则C语言不再计算右边表达式,因为无论右边表达式的值为什么,整个逻辑表达式的值都为0。同样,在“||”连接的逻辑表达式中,当左边表达式的值为非0,则C语言不再计算右边表达式,因为无论右边表达式的值为什么,整个逻辑表达式的值都为1。如:inta=b=m=n=1;(m=a!=b)&&(n=a!=b)a!=b不成立为0,m得0,n仍为1inta=b=m=n=0;(m=a==b)||(n=a==b)a==b成立为1,m得1,n仍为0(5).C语言中,赋值号“=”,逗号“,”都是运算符。a=10是赋值表达式,a=10;是赋值语句,sum=0,i=0是逗号表达式,它是由二个赋值表达式用逗号运算符连起来的逗号表达式。练习题一、单项选择题1.下列数据中属于“字符串常量”的是()。A.”a”B.{ABC}C.’abc\0’D.’a’2.下列数据中属于“字符串常量”的是()。A.ABCB.“ABC”C.’abc’D.’a’3.在PC机中,’\n’在内存占用的字节数是()。A.1B.2C.3D.44.在PC机中,”a\xff”在内存占用的字节数是()。A.5B.6C.3D.45.字符串”ABC”在内存占用的字节数是()。A.3B.4C.6D.86.字符串”\”ABCD\””在内存占用的字节数是()。A.4B.6C.7D.87.在C语言中,合法的长整型常数是()。A.0LB.4962710C.0.054838743D.2.1869e108.在C语言中,合法的短整型常数是()。A.OLB.0821C.40000D.0x2a9.下列数据中不属于“字符常量”的是()。A.‘\a’B.‘\160’C.‘070’D.07010.char型常量在内存中存放的是()。A.ASCII代码值B.BCD代码值C.内码值D.十进制代码值11.设整型变量m,n,a,b,c,d均为0,执行(m=a==b)||(n=c==d)后,m,n的值是()。A.0,0B.0,1C.1,0D.1,112.设整型变量m,n,a,b,c,d均为1,执行“(m=ab)&&(n=ab)”后,m,n的值是()。A.0,0B.0,1C.1,0D.1,113.设a为2,执行下列语句后,b的值不为0.5的是()。A.b=1.0/aB.b=(float)(1/a)C.b=1/(float)aD.b=1/(a*1.0)14.设a为5,执行下列语句后,b的值不为2的是()。A.b=a/2B.b=6-(--a)C.b=a%2D.b=a3?2:215.执行语句“x=(a=3,b=a--)”后,x,a,b的值依次为()。A.3,3,2B.3,2,2C.3,2,3D.2,3,216.intb=0,x=1;执行语句“if(x++)b=x+1;”后,x,b的值依次为()。A.2,3B.2,0C.3,0D.3,217.设有语句inta=3;,则执行了语句a+=a-=a*a;后,变量a的值是()。A.3B.0C.9D.-1218.设有语句inta=3;,则执行了语句a+=a-=a*=a;后,变量a的值是()。A.3B.0C.9D.-1219.inta=4,b=3,c=-2,d=2;逻辑表达式a0&&b&&c0&&d0的值是()。A.1B.0C.-1D.出错20.在以下一组运算符中,优先级最高的运算符是()。A.=B.=C.%D.&&21.设整型变量i的值为3,则计算表达式i---i后表达式的值为()。A.0B.1C.2D.表达式出错22.设整型变量i,j=3;则计算表达式i=j+++j后i,j的值为()。A.4,4B.6,6C.4,6D.6,423.设整型变量a,b,c均为2,表达式a+++b++c++的结果是()。A.6B.9C.8D.表达式出错24.设整型变量i值为2,表达式(++i)+(++i)+(++i)的结果是()。A.6B.12C.15D.表达式出错25.设整型变量i,j值均为3,执行了“j=i++,j++,++i”后,i,j的值是()。A.3,3B.5,4C.4,5D.6,626.若已定义x和y为double类型,则表达式;x=1,y=x+3/2的值是()。A.1B.2C.2.0D.2.527.sizeof(double)的结果值是()。A.8B.4C.2D.出错28.表达式“1?(0?3:2):(10?1:0)”的值是()。A.3B.2C.1D.029.设a=1,b=2,c=3,d=4,则表达式:ab?a:cd?a:d的结果为()。A.4B.3C.2D.130.设a为整型变量,不能正确表达数学关系:10a15的C语言表达式是()。A.10a15B.a==11||a==12||a==13||a==14C.a10&&a15D.!(a=10)&&!(a=15)31.inta=0;if(a=1)a+=10;结果的值是()。A.0B.11C.10D.出错32.下列表达式中符合C语言语法的赋值表达式是()。A.a=7+b+c=a+7B.a=7+b++=a+7C.a=(7+b,b++,a+7)D.a=7+b,c=a+733.设f是实型变量,下列表达式中不是逗号表达式的是()。A.f=3.2,1.0B.f0,f10C.f=2.0,f0D.f=(3.2,1.0)34.下列表达式中,不正确的表达式是()。A.a=1,b=1B.y=int(x)C.a=b=5D.i++35.若有以下定义:chara、intb、floatc、doubled,则表达式a*b+d-c值的类型是()。A.floatB.intC.charD.double36.intn;floatf=13.8;执行“n=((