第2章基本数据类型和运算学习和解题要点1.数据类型C 语言中的数据类型比别的语言丰富。
要学好这部分内容,首先要掌握C 语言的数据在内存中的表示。
整型数据:以二进制的形式表示(1) int 类型正数:如 123 (+123)用 16 位二进制(二个字节)表示原码最大正整数 215-1=214+213+23+22+21+20=32767负数:如–123原码反码(符号位不动,其它取反)补码(补码加已知补码求原负数符号位不动,其它取反加 1加最大负整数-215=32768 因为 -215 < -(215-1) 所以用 -215而不用 -(215-1)(2) unsigned (int) 类型称为无符号整数,它不是指不带“+ 或 -”号的整数,而是指内存表示这类数时没有符号位,16 位二进制都用来表示数,因此最大数 215+214+213+23+22+21+20=65535最小数 0(3) long (int) 类型用 32 位二进制(四个字节)表示,其他同 int 型(4) short 类型有的计算机(小型、中型、大型机)int 即是 long ,而short用16 位二进制(二个字节)表示。
因此C语言中,short一定是短整型,long一定是长整型,而int因不同的系统而不同。
PC 586 机int即short,所以一般不用short 。
(5) 在C语言中,整型常量有三种形式的写法:十进制整数(0 - 9)表示。
通常整数的写法。
八进制整数(0 - 7)表示。
在整数的前面加数字0。
十六进制整数(0 - f)表示。
在整数的前面加0x。
长整型常量表示方法:在整数的后面加L或 l。
字符型数据:以二进制的形式表示char 型用 8位二进制(一个字节)表示如‘a’,在程序中要用单引号表示,输出时无单引号,内存中表示为6+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 ,即使是 float x; 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。
同理 char c=’A’; switch(c++) { case ‘A’: printf(“%c”,c);break;………},输出为B。
(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). 在算术表达式中应注意各类数值型数据间的混合运算问题,如下:double float float 型一定先转换成double型参加运算。
long运算对象不同时转换方向。
unsignedint char, short char, short型一定先转换成int型参加运算。
(2). C语言无“真假值”,判断成立则结果为1,不成立则结果为0。
而当表达式的值为非0则认为“真”,当表达式的值为0则认为“假”。
(3). 关系表达式中,数学上的 0<x<10不能写成 0<x<10 而应写成 0<x && x<10,不然会引起很大的错误。
如:当 x=20 时,数学上0<x<10是不符合的,但在C程序中认为成立。
这是因为C程序从左向右判别,0<x成立,则结果为1,1<10也成立。
(4).在“&&”连接的逻辑表达式中,当左边表达式的值为0,则C语言不再计算右边表达式,因为无论右边表达式的值为什么,整个逻辑表达式的值都为0。
同样,在“||”连接的逻辑表达式中,当左边表达式的值为非0,则C语言不再计算右边表达式,因为无论右边表达式的值为什么,整个逻辑表达式的值都为1 。
如:int a=b=m=n=1; (m=a!=b)&&(n=a!=b) a!=b不成立为0,m得0,n仍为1int a=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.ABC B. “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=a>b)&&(n=a>b)”后,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=a>3?2:215. 执行语句“x=(a=3,b=a--)”后,x,a,b的值依次为()。
A. 3,3,2B. 3,2,2C. 3,2,3D. 2,3,216. int b=0,x=1; 执行语句“if(x++) b=x+1;”后,x,b的值依次为()。
A. 2,3B. 2,0C. 3,0D. 3,217.设有语句int a=3;,则执行了语句a+=a-=a*a;后,变量a的值是()。
A. 3B. 0C. 9D. -1218.设有语句int a=3;,则执行了语句a+=a-=a*=a;后,变量a的值是()。
A. 3B. 0C. 9D. -1219. int a=4,b=3,c=-2,d=2; 逻辑表达式a>0&&b&&c<0&&d>0的值是()。
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的值是()。