第2章 基本数据类型与数值表达式
2.1 知识要点
计算机的基本功能是进行数据处理。在C++语言中,数据处理的基本对象是常量和变量。运算是对各种形式的数据进行处理。数据在内存中存放的情况由数据类型所决定。数据的操作要通过运算符实现,而数据和运算符共同组成了表达式。本章是对C++语言中的数据类型、运算符、表达式等内容的全面介绍,要正确理解其特点,并灵活运用,主要掌握以下的知识要点:
1.掌握常量和变量的概念。
2.掌握整型数据和实型数据、字符型数据和字符串型数据的概念和区别。
3.掌握各种类型的变量说明及其初始化。
4.掌握算术运算、关系运算、逻辑运算、赋值运算、逗号运算、条件运算等概念。
5.掌握运算符的优先级、左结合和右结合规则。
6.掌握表达式求值时的自动转换和强制类型转换。
7.掌握自加、自减运算的规则。
8.掌握常用数学函数的功能。
2.2 典型例题分析与解答
1. 选择题
例题1:运算符+、=、*、>=中,优先级最高的运算符是( )。
A.+ B.= C.* D.>=
答案:C
分析:根据C++语言对运算符优先级的规则,以上运算符优先级从低到高的次序为=、>=、+、*。
例题2:下列说法正确的是( )。
A.cout<<”/n”是一个语句,它能在屏幕上显示”/n”
B./68代表的是字符D。
C.1E+5的写法正确,它表示余割整型常量。
D.0x10相当于020。
答案:D
分析:分号是语句的已部分,且/n是转义字符;/68代表了八进制的6、8,而八进制中没有数字8;1E+5是实型常量;十六进制的10相当于十进制的16,相当于八进制的20。
例题3:下列不合法的变量名为( )。
A.int B.int1 C.name_1 D.name0
答案:A
分析:根据变量名命名要求,变量名只能由大小写字母、数字、下划线组成,且系统关键字不能作为变量名。
例题4:下面正确的为( )。
A.4.1/2 B.3.2%3
C.3/2==1 结果为1 D.7/2 结果为3.5
答案:A
分析:%运算符要求式整型;关系运算值为0;两个整数相除,商为为相除后的整数部分。
例题5:已知a=4,b=6,c=8,d=9,则“(a++,b>a++&&c>d)?++d:a<b” 值为( )。
A.9 B.6 C.8 D.0
答案:D
分析:此题是考察“++”运算符、逗号运算符、条件运算符及它们运算优先级的综合题,根据这些运算符的运算规则,得出表达式的运算结果。
例题6:已知i=5,j=0,下列各式中运算结果为j=6的表达式是( )。
A.j=i+(++j) B.j=j+i++ C.j=++i+j D.j=j+++i
答案:C
分析:自增++、自减运算符在变量的前面或后面,其运算结果是不同的。若++或—在变量前,则先将变量的值加1(或减1)后,再将变量的值参与运算;反之则先将变量的值参加运算,再将变量的值加1(或减1)。自增++、自减运算符优先级高于算术运算符。
例题7:已知x=43,ch=‘A’,y=0;则表达式(x>=y&&ch<’B’&&!y)的值是( )。
A.0 B.语法错 C.1 D.“假”
分析:根据C++语言中运算符优先级的高低,“!”运算符最高,关系运算符高于逻辑运算符。则上面的表达式转换为:1&&1&&1,结果为1。
答案:C。
2. 填空题
例题8:如果s是int型变量,且s=6,则下面s%2+(s+1)%2表达式的值为____。
答案:1
分析:%运算符是求余运算,得到的结果是相除后的余数。表达式转换为6%2+(6+1)%2=0+7%2=1。
例题9:如果定义int a=2,b=3;float x=5.5,y=3.5;则表达式(float)(a+b)/2+(int)x%(int)y的值为_____。
答案:4.5
分析:不同类型的数据混合运算时,可以使用强制类型转换符,强制将一种数据类型转换为另一种数据类型后再进行运算。对表达式,先求表达式的值,再转换值的类型,本题的运算结果为4.5。
例题10:设所有变量均为整型,则表达式(e=2,f=5,e++,f++,e+f)的值为____。
答案:9
分析:逗号运算符是是将两个或多个表达式组合成一个表达式的运算符。求解时从左至右依次计算每个表达式的值,整个表达式的值就是最右边的表达式的值。本题的答案为9。
例题11:已知字母a的ASCII码为十进制数97,且设ch为字符型变量,则表达式ch=’a’+’8’-‘4’的值为____。
答案:e
分析:C++语言中,对字符数据进行算术运算,实际上就是对字符的ASCII码进行运算。以字符形式输出时,再将ASCII码转换为相应的字符输出。本题表达式为ch=97+8-4=101,101相应的ASCII为字符e。
3. 编程题
例题12:编写一个程序,从键盘输入半径和高,输出圆柱体的底面积和体积。
解:程序如下:
#include<iostrean.h>
void main()
{
double r, h, area, volume;
cout<<”请输入半径:”;
cin>>r;
cout<<”请输入高:”;
cin>>h;
area=3.14*r*r;
volume=area*h;
cout<<”底面积是: ”<<area<<endl;
cout<<”体积是: ”<<volume<<endl;
}
2.3 教材习题分析与解答
1. C++语言中有哪些数据类型?分别说明它们的类型关键字、取值范围、类型长度。
答:C++语言中的数据类型有:整型(短整型,整型,长整型);字符型;逻辑型;枚举型;实型(单精度,双精度,长双精度);引用型(指针,引用);复合型(结构,联合);空类型。
2. 字符常量与字符串常量的区别是什么?
答:字符常量与字符串常量的主要区别在于:(1)定界符不同。字符常量使用单引号,而字符串常量使用双引号。(2)长度不同。字符常量的长度固定为1,而字符串常量的长度,可以是0,也可以是某个整数。(3)存储要求不同。字符常量存储的是字符的ASCII码值,而字符串常量除了要存储有效的字符外,还要存储一个结束标志’/0’。
3.说明下面的每个数据各属于哪一种(数值常量、字符常量、字符串、标识符、保留字、运算符、标点、非法数据)?
25 18 -3.67 12.8 “4” ‘4’
x1 “x2” “1949.10” cin K_name
3ab “float x ,y “ ; if +
“/n” ? ; “sy1.cpp” ‘/32’ /’
答:数值常量有:25,18,-3.67, 12.8
字符常量有:‘4’,/’,‘/32’
字符串有:“4”,“x2”, “1949.10”, “sy1.cpp”, “/n”
保留字:cin ,int,endl,if
运算符:+
标点:?
非法数据:“float x ,y “ ; , 3ab
变量:x1,K_name
4.选择题
(1)下列数据类型不是C++语言基本数据类型的是( )。
A.字符型 B.整型 C.实型 D.数组
答案:D
(2)在C++语言中,080是( )。
A.八进制数 B.十进制数 C.十六进制数 D.非法数
答案:B
(3)下列字符列中,可作为C++语言程序自定义标识符是( )。
A.switch B.file C.break D.do
答案:B
(4) 运算符 +、<=、=、% 中,优先级最低的运算符是( )。
A. + B.<= C.= D.%
答案:C
(5) 下列字符列中,可以作为“字符串常量”的是( )。
A. ABC B.″xyz″ C.′uvw′ D. ′a′
答案:B
(6) 设变量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
答案:C
(7) 字符串”vm/x43///np/102q”的长度是( )。
A. 8 B. 10 C. 17 D. 16
答案:A
(8) 在C++语言中,自定义的标识符( )。
A.能使用关键字并且不区分大小写 B.不能使用关键字并且不区分大小写
C.能使用关键字并且区分大小写 D.不能使用关键字并且区分大小写
答案:D
(9)设有代码“int a = 5;”,则执行了语句“a + = a - = a*a;”后,变量a的值是( )。
A.3 B. 0 C. -40 D. –12
答案:C
(10)设a为5,执行下列代码后,b的值不为2的是( )。
A. b = a/2 B. b = 6-(--a)
C. b = a%2 D. b = a < 3 ? 3: 2
答案:C
(11)下面的( )均是C语言的整型常量。
A.0xffff 和 611 B.01b 和 0xa1 C.986.012 和 0667 D.2e4 和 0x
答案:A
(12)数学公式 写成C表达式,下面的( )是正确的。
A.sqrt (abs(pow(x, y) + exp(y))) B.sqrt (abs(pow(y, x) + exp(y)))
C.sqrt (fabs(pow(x, y) + exp(y))) D.sqrt (fabs(pow(y, x) + exp(y)))
答案:D
5.x为int类型,y为double类型,指出下列各表达式值的类型。
(1)1/3 int (2) 48L long
(3) 5 % 3 int (4) x*3/y double
(5) ‘x’+20 int (6) (int )y int
(7) y != 10 bool (8) x<1 || x>10 bool
(9) x>10 ? x : sqrt (x) int或float (10) x && y bool
(11) true bool (12) (char) (x+10) char
(13) 1.0 /3 float (14) sizeof (float) int
(15) x,y,x+y, double
说明:(9)题,如果x>10成立,表达式值的类型为int,如果x>10不成立,表达式值的类型为float。(15)题,为逗号表达式,x+y的值即为整个表达式的值,因而值的类型为double。bool型在C++用int代替,true值为1,false值为0。
6. 写出下列算术表达式的值:
(1) x+a%3*(int)(x+y)%2/4 x=2.5,a=7,y=4.7
答:上述表达式=2.5+1*(int)7.2%2/4 = 2.5+1*7%2/4 = 2.5
(2) (float)(a+b)/2+(int)x%(int)y a=2,b=3,x=3.5,y=2.5
答:上述表达式=(float)5/2+3%2 = 2.5+1 = 3.5
7.设程序中有说明语句
int a=20; double x=4.7; char r= ’a’;
试求出下列每个表达式的值(假定各表达式互不影响)。~
答案 答案
(1)a++ 20 (2) ++r 98
(3) 1+a/3%4 3 (4) 10*sizeof( int ) 40
(5) char (a+20) ( (6)a= =r || a= =floor(x) 0
(7) a/9.0 2.222222 (8)x=pow(3,5) 273.000000
(9) x=(a++,r++) 97.000000 (10) ceil(x-0.5) 5.000000
(11) a=abs(a)%8-10 -6 (12)x=fabs(-27.2)+6 33.200000
(13)floor(x+0.5) 5.000000 (14) ceil((x-=0.5)-0.5) 4.000000
(15)floor(x*1000+0.5)/1000 4.700000 (16)floor(x+0.5) 5.000000
(17)floor(x*1000)/1000 4.700000 (18)a+rand()%40 某一个随机整数
(19) a % =n % = 2),n=5 5
此题运行时要给n赋初值, n必须是整型奇数,n为整型偶数出错。
(20) a + = a - = a * = a 0
说明:函数ceil(x),返回大于等于x的最小整数;floor(x),返回小于等于x的最大整数;rand(),返回0~32767之间的整数。
8.设程序中有说明语句
int x=20; float y=4.7; char ch = ’k’;
试求出下列每个表达式的值(假定各表达式互不影响)
答案 答案
(1) x==0 0 (2) x!=y 1
(3) x++ >21 0 (4) ‘a’ == ‘A’ 0
(5) ch != 0 1 (6) x>0 && y>0 1
(7) x>0 && 1 1 (8) y>0 && 0 0
(9) !(x||y)==!x&&!y 0 (10) x++ !=20 || y 1
(11) !! ch==ch 0 (12) !(x&&y)==!x||!y 1
说明:C++语言提供了三种逻辑运算符:!,&&,||,其中!逻辑非的优先级最高,&&逻辑与次之,||逻辑或最低。!逻辑非是右结合性,&&逻辑与和||逻辑或是左结合性。
2.4 补充习题
1. 选择题
(1)C++语言中的标识符只能右字母、数字和下划线三种字符组成,且第一个字符( )。
A.必须为字母 B.必须为下划线
C.必须为字母或下划线 D.可以是字母、数字和下划线中任一中字符
(2)下面正确的字符常量是( )。
A.“C” B.‘//’’ C.‘W’ D.‘’
(3)如果说明语句:char c=‘/72’;则变量c( )。
A.包含1个字符 B.包含2 个字符
C.包含3个字符 D.说明不合法,c 的值不确定
(4)表达式18/4*sqrt(4.0)/8值的数据类型为( )。
A.int B.float C.double D.不确定
(5)关于逻辑运算符的说法正确的是( )。
A.它们都是双目运算符,优先级相同
B.语句“int a=0,c=1,b;b=a&&c++;” 执行后,c 的值为2
C.语句“int a=0,c=1,b;b=a||c++;” 执行后,c 的值为2
D.语句“int a=1,c=1,b;b=a&&c++;” 执行后,c 的值为2
(6)设 int m=7,n=12;则表达式为3的是( )。
A.n%=(m%=5) B.n%=(m-m%5)
C.n%=m-m%5 D.(n%=m)-(m%=5)
(7)数学公式yx+lny,正确的C++语言的表达式是( )。
A.sqrt(fabs(pow(y,x)+log(y))) B.sqrt(fabs(pow(x,y)+log(y)))
C.sqrt(abs(pow(y,x)+log(y))) D.sqrt(abs(pow(x,y)+log(y)))
(8)有如下程序段:
int a=14,b=15,x;
char c=’A’;
x=(a&&b)&&(c<’B’);
执行该程序后,x的值为( )。
A.ture B.flase C.0 D.1
(9)下面四个选项中,均是不合法的标识符的是( )。
A.B B.for C.cin D.if
B_1 1a0 a_b temp
cout _a10 int b-a
(10)设变量a是整型,b是实型,c是双精度型,则表达式10+‘a’+c*b值的数据类型为( )。
A.int B.float C.double D.不确定
(11)以下叙述中不正确的是( )。
A.在C++程序中,name和NAME是两个不同的变量
B.在C++ 程序中,逗号运算符的优先级最低
C.若变量m,n为int型,则m=n后,n中的值不变
D.当从键盘输入数据时,对于整型变量只能输入整型数值,对于实型变量只能诸如实型数值。
(12)sizeof(float)是( )。
A.一个双精度型表达式 B.一个整型表达式
C.一种函数调用 D.一个不合法的表达式
(13)下面不正确的字符串常量是( )。
A.‘rst’ B.“14‘14” C.“0” D.“ ”
(14)对代数式5ae/bc,下面不正确的C++语言表达式是( )。
A.a/b/c*e*5 B.5*a*e/b/c C.5*a*e/b*c D.a*e/c/b*5
(15)下列运算符中优先级最高的是( )。
A.?: B.&& C.+ D.!=
(16)设a是整型变量,则表达式(a=4*5,a*2),a+6的值是( )。
A.20 B.26 C.40 D.46
(17)设有:int a=1,b=2,c=3,d=4,m=2,n=2;执行(m=a>b)&&(n=c<d)后n的值为( )。
A.1 B.2 C.3 D.4
(18)用C++的语言表达式表示 |x3+log10x|的正确是( )。
A.fabs(x*3+log(x)) B.abs(pow(x,3)+log(x))
C.f abs(pow(x,3.0)+log(x)) D.abs(pow(x,3.0)+log(x))
(19)设int k=7,x=12;则能使值为3的表达式是_____。
A.x%=(k%=5) B.x%=(k-k%5)
C.x%=k-k%5 D.(x%=k)-(k%=5)
(20)设有语句:int a=7;float x=2.5,y=4.7;则表达式x+a%3*(int)(x+y)%2/4的值是( )。
A.2.500000 B.2.750000 C.3.500000 D.0.000000
(21)设有语句int x=3,y=4,z=5;则下面表达式中值为0的是( )。
A.’x’&&’y’ B.x<=y
C.x||y+z&&y-z D.!((x<y)&& !z | | 1)
(22)表达式18/4*sqrt(4.0)/8值的数据类型为( )。
A.int B.float C.double D.不确定
(23)判断char型变量n是否为小写字母的正确表达式为( )。
A.’a’<= n <=’z’ B.(n>=a)&&(n<=z)
C.(’a’>=n)| |(’z’<=n) D.(n>=’a’)&&(n<=’z’)
2. 填空题
(1) “A”与‘A’的区别是:前者表示的是__________,占用______个内存空间,后者表示的是_________,占用_______个内存空间。
(2) 表达式8/4*(int)2.5/(int)(1.25*(3.7+2.3))值的数据类型为_________。
(3)已知c的ASCII码为十进制数99,设k为字符型变量,则表达式k=‘c’+‘9’-‘8’的值为________。
(4)设有说明语句 int a=6;,则运算表达式a+=a-=a*a后,a的值为_______。
(5)C++表达式表达:y=ax2+bx+c_________________, 5x3+9xy/5-xy______________。
(6)设a、b、c都是int型变量,则运算表达式a=(b=4)+(c=2)后,a值为_____,b值为______,c值为______。
(7) C++语言中的标识符只能由三种字符组成,它们是________,_______和_______。
(8)有语句:char k=‘/010’;则变量k中包含的字符个数是_____。
(9)在C++语言中,表示逻辑“真”值用_____________。
(10)表达式pow(2.8,sqrt(double(x)))值的数据类型为_________。
(11)设m是一个三位数,从左到右用a、b、c表示各位是数字,则从左到右各个数字是cba的三位数的表达式是_________________________。
(12)设有语句int a=3,b=4,c=5;则表达式:!(a+b)+c-1&&b+c/2的值为______,表达式a | | b+c&& b = = c的值为______。
(13) 请写出判断整型变量x为偶数且不小于100的表达式:______________________。
3. 编程题
(1)用C++语言写出下列要求的表达式:
判断char型变量ch是否为大写字母。
‚ 设y为int变量,判断y是否为奇数。
ƒ 设x、y、z都为int型变量,描述“x或y中有一个小于z”。
„ 设x、y、z都为int型变量,描述“x、y和 z中有两个为负数”。
(2)编写一个程序,从键盘输入两个整型的数,在屏幕上分别输出这两个数的和、差和积。
(3)编写一个程序,从键盘输入两个数,分别求出这两个数的平方和和立方和,在屏幕上予以输出。
(4)编写程序,从键盘输入某一字母的ASCII码,如:97(字母a),98(字母b),65(字母A)等,在屏幕上输出给字母。