浙江大学c语言总复习题—基本数据类型和运算 (1)
第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+21211109876543+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 。
0 0 0 0 0 0 0 0 0 1 1 1 1 0 1 1 0 0 0 0 0 0 0 0 0 1 1 1 1 0 1 1
符号位0表示正
0 0 0 0 0 0 0 0 0 1 1 1 1 0 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 0 0 0 0 0 0 0 0 1 1 1 1 0 1 1 符号位1表示负
1 1 1 1 1 1 1 1 1 0 0 0 0 1 0 0
1 1 1 1 1 1 1 1 1 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 1 1 1 1 0 1 0 1 0 0 0 0 0 0 0 0 1 1 1 1 0 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
字符型数据:以二进制的形式表示
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 ,
即使是 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 。
0 1 1 0 0 0 0 1
0 .12345 的二进制表示 0 3的二进制表示
数符 小数部分 指数符 指数
+ 0.12345 + 103 32位
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). 在算术表达式中应注意各类数值型数据间的混合运算问题,如下:
double float float 型一定先转换成double型参加运算。
long
运算对象不同时转换方向。
unsigned
int char, short char, short型一定先转换成int型参加运算。
(2). C语言无“真假值”,判断成立则结果为1,不成立则结果为0。而当表达式的值为非0则认为“真”,当表达式的值为0则认为“假”。
(3). 关系表达式中,数学上的 0 (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仍为1 int 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. 1 B. 2 C. 3 D. 4 4. 在PC机中,”a\xff”在内存占用的字节数是()。 A. 5 B. 6 C. 3 D. 4 5.字符串”ABC”在内存占用的字节数是()。 A. 3 B. 4 C. 6 D. 8 6.字符串”\”ABCD\””在内存占用的字节数是()。 A. 4 B. 6 C. 7 D. 8 7. 在C语言中,合法的长整型常数是()。 A. 0L B. 4962710 C. 0.054838743 D. 2.1869e10 8.在C语言中,合法的短整型常数是()。 A. OL B. 0821 C. 40000 D. 0x2a 9.下列数据中不属于“字符常量”的是()。 A. ‘\a’ B. ‘\160’ C. ‘070’ D. 070 10.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,0 B. 0,1 C. 1,0 D. 1,1 12.设整型变量m,n,a,b,c,d均为1,执行“(m=a>b)&&(n=a>b)”后,m,n的值是()。 A. 0,0 B. 0,1 C. 1,0 D. 1,1 13.设a为2,执行下列语句后,b的值不为0.5的是()。 A. b=1.0/a B. b=(float)(1/a) C. b=1/(float)a D. b=1/(a*1.0) 14.设a为5,执行下列语句后,b的值不为2的是()。 A. b=a/2 B. b=6-(--a) C. b=a%2 D. b=a>3?2:2 15. 执行语句“x=(a=3,b=a--)”后,x,a,b的值依次为()。 A. 3,3,2 B. 3,2,2 C. 3,2,3 D. 2,3,2 16. int b=0,x=1; 执行语句“if(x++) b=x+1;”后,x,b的值依次为()。 A. 2,3 B. 2,0 C. 3,0 D. 3,2 17.设有语句int a=3;,则执行了语句a+=a-=a*a;后,变量a的值是()。 A. 3 B. 0 C. 9 D. -12 18.设有语句int a=3;,则执行了语句a+=a-=a*=a;后,变量a的值是()。 A. 3 B. 0 C. 9 D. -12 19. int a=4,b=3,c=-2,d=2; 逻辑表达式a>0&&b&&c<0&&d>0的值是()。 A. 1 B. 0 C. -1 D. 出错 20.在以下一组运算符中,优先级最高的运算符是()。 A. <= B. = C. % D. && 21.设整型变量i的值为3,则计算表达式i---i后表达式的值为()。 A. 0 B. 1 C. 2 D. 表达式出错 22.设整型变量i,j=3; 则计算表达式i=j+++j后i,j的值为()。 A. 4,4 B. 6,6 C. 4,6 D. 6,4 23.设整型变量a,b,c均为2,表达式a+++b++c++的结果是()。 A. 6 B. 9 C. 8 D. 表达式出错 24.设整型变量i值为2,表达式(++i)+(++i)+(++i)的结果是()。 A. 6 B. 12 C. 15 D. 表达式出错 25.设整型变量i,j值均为3,执行了“j=i++,j++,++i”后,i,j的值是()。 A. 3,3 B. 5,4 C. 4,5 D. 6,6 26.若已定义x和y为double类型,则表达式;x=1,y=x+3/2的值是()。 A. 1 B. 2 C. 2.0 D. 2.5 27.sizeof(double)的结果值是( )。 A.8 B. 4 C. 2 D. 出错 28. 表达式“1?(0?3:2):(10?1:0)”的值是()。 A. 3 B. 2 C. 1 D. 0 29.设a=1,b=2,c=3,d=4,则表达式:a A. 4 B. 3 C. 2 D. 1