资源描述
实验2 数据类型、运算符和表达式
一、实验目的和要求
1.掌握常量的表示法【字符和字符串常量、短整型、整型和长整型、实数(float)和双精度实数(double)】。
2.掌握各种类型变量的说明及初始化。
3.掌握各种运算符和各类表达式
(1)算术运算、逻辑运算、关系运算、++和 ――运算、三目条件运算符;
(2)运算符的优先级、结合规则和目数的概念;
(3)类型的自动转换和强制类型转换;
(4)表达式的组成、左值和赋值,逻辑表达式的求值优化。
二、实验准备
知识点:
1.数据类型
C++提供了十分丰富的数据类型,除基本类型外,还提供了 。基本数据类型中包括字符型,可用 表示,占用 字节;整型,可用 表示,占用 字节;实型,可用 表示,占用 字节;双精度型,可用 表示,占用 字节;无值型,可用 表示,占用 字节。
2.标识符的命名规则
标识符命名应以 开始,由 组成,长度
。
3.常量
(1)常量可分为 、 、 、 和 。
(2)十进制整数常量以 开头;八进制整数常量以 开头,由 组成;十六进制整数常量以 开头,由 组成;长整型数以 结尾;无符号整型数以 结尾;无符号长整型数以 结尾。
(3)指数形式的实型常量要求在E或e前 ,且在E或e之后的指数部分 。
(4)字符常量是以 括起来的 个字符。转义序列以 开始,后跟一个 或一个 的办法来表示一个字符。若转义字符后是一个整型常量,它必须是 和 进制,且其对应的十进制取值范围必须在 之间,该八进制数以 开头,也可以不以 开头,而 进制数必须以 开头。‘\t’表示 ;‘\n’表示 ;‘\\’表示 ;
(5)字符串常量是以 括起来的 个字符;字符串常量与字符常量的存放格式的区别是 。
(6)标识符常量可用两种方法定义标识符常量:一种是使用 ,另一种是利用常量说明语句 。
4.变量
变量要求 在前, 在后;变量说明语句可以出现 ,同一变量只能作 次定义性说明;首次引用变量时,变量必须有一个 ;对变量赋初值的三种方法: 、 和通过输入流cin对变量赋初值。
5.运算符与表达式
(1)算术运算
C++中的算术运算符有两个单目运算符(只有一个操作数的运算符): 和 ;五个双目运算符(有两个操作数的运算符):+(加)、―(减)、*(乘)、/(除)和 。
(2)关系运算
C++提供六种关系运算符:>(大于)、<(小于)、>=(大于等于)、<=(小于等于)、= =(等于)、!=(不等于)。前面4种(>,<,>=,<=)优先级相同,后两种(==,!=)优先级相同,前4种高于后两种。结合性都为右结合。关系运算符是完成两个操作数的比较运算,即比较两个操作数的数值大小。运算的结果为一整数,当关系成立时,其运算结果为 ;当关系不成立时,其运算结果为整数 。 关系运算的结果 参与表达式的运算。
(3)逻辑运算
C++中提供三种逻辑运算符:逻辑非(!)、逻辑与(&&)和逻辑或(||);第一个运算符是单目运算,后两转者是双目运算符。在计算过程中,要注意&&的优先级低于!优先级,但高于||的优先级。!为左结合,而其它两个为右结合。逻辑运算要注意逻辑表达式的副作用:对于a&&b&&c,只有a为 时,才需要计算b的值,因为当a为 时,不管后面的项如何,都能得到该表达式的值就为0。同样只有在a和b都为 的情况下才需要计算c的值。;对于a||b||c,只要a为 ,就不需要判断b和c的值,而只有当a、b都为 时才需要计算c项。
(4)赋值运算
C++中赋值运算符分为两种:单一赋值运算符(=)和复合赋值运算符(+=, –=, *=, /=, %=, &=, ^=, |=, <<=, >>= ),都为双目运算符,结合性为左结合,其运算法则为:将左操作数与右操作数进行相应的运算,再将结果赋给左操作数。对于赋值运算符,其左操作数必须为 。
(5)sizeof()运算符
sizeof()运算符是用来计算 ,它为单目运算符。该运算符与其它类型的基本运算符稍有不同,它的操作数必须在括号内,其使用格式为:
sizeof(<类型>) 或sizeof(<表达式>)
(6)自增、自减运算
自增运算符“++”和自减运算符“--”都具有两种形式,且它们都是单目运算符,操作数必须为变量,一般是整型变量,但也可以是实型或字符型变量。
++i (前置自增: )
i++ (后置自增: )
--i (前置自减: )
i-- (后置自减: )
(7)逗号运算
逗号运算符的优先级为所有运算符中最低的,结合性为右结合。逗号表达式的一般形式为: <表达式1>,<表达式2>, … , < 表达式n>
其运算顺序为按从左到右的顺序依次求出各表达式的值,并把最后一个表达式的值作为整个逗号表达式的值。
(8)条件运算
条件运算符“? :”为三目运算符,要求有三个操作对象,使用格式为:
<表达式1> ? <表达式2> : <表达式3>
计算过程为:先计算<表达式1>,若其值不等于0,则计算<表达式2>,并将计算的值作为该条件表达式的值;否则求解<表达式3>的值,并将该值作为条件表达式的值。
其优先级高于赋值和逗号运算,左结合。
(9)常用运算符的优先级
高 !++ —— 负号
算术运算
关系运算
逻辑运算
条件运算
赋值运算(含复合赋值)
低 逗号运算
(10)类型转换
在求表达式值的过程中,对于双目运算符,通常会出现两个操作数的类型不一致的情形,这时就要求将这两个操作数转换为同一类型,然后再进行运算。可以分为三种情况的转换:
不同类型数据的混合运算、赋值时的类型转换和强制类型转换,分别要注意这三种情况的数据类型的转换。
练习题
1.下列定义变量和常量的方法中指出哪些是错误的,如何修改?
(1)const k=10; (2)int i.j;int i=10;
(3)#define pp=3.14 (4)const int j;
答:(1)
(2)
(3)
(4)
2.下列符号中,哪些是合法的标识符?
Abs3 3block a+b _else Class sum for my_class fun(4) a-b
答:(1)合法的有
(2)不合法的有
3.设有如下的变量说明:
int a=2,b=3,c=9;
float x=2.3,y=4.5,z=6.0;
char cha1=’a’,ch2=’b’;
请计算以下表达式及各变量的值:
(1)sizeof(a+3.4) (2)x++ +ch1 (3)!a--&&a>b||x
(4)a=a+2,b++,c=b+d (5)a+=b*=c+ch1
答:
1
2
3
4
5
4.设有如下的变量说明:
int m=3,n=9,k=15;
int a=0,b=0,c=0;
请计算以下表达式及各变量的值:
(1)a=m>n && ++k (2)a+=m<=n && !n++ && k++
(3)a=n>=k&&b++||++c (4)a*=m<n||++b && (c=4)
(5)a=m+++n (6)a=m++ + ++n
(7)a=m*k+n*k++ (8)a=++m*k+m
1
2
3
4
5
6
7
8
5.用C++表达式描述下列命题:
(1) a大于b且b大于c;答:
(2) a大于b或大于c; 答:
(3) a大于b且小于c; 答:
(4) a不能被b整除; 答:
6.C++关系表达式中的关系成立时,则该关系表达式的值为
7.int x=-5,y;cout <<(x>0?1:x<0?-1:0);输出的结果为 。
程序分析
1.在数学式中,变量x和y的取值为整数,而变量a和b的取值为实数,在C++程序中对应的正确表达式是
A.3/5*x*y/a/b B. 3*x*y/5/a/b C. 3*x*y/5*a*b D. 3/a/b/5*x*y
答案为:D。注意整数和整数相除得到的结果仍为整数。要保证表达式的值为实数,必须使第一个除法运算其中一个操作数为实数。
2.设有四个常数:①4e0.5,②‘\87’,③0x5a,④“\””,其中符合C++语法规则的常量是
A.②③ B.②④ C.③④ D.①②
答案为:C。其中①式指数部分必须是整数,②转义字符序列中八进制值只允许出现数字0-7。所以只有③和④是合法的。
3.设有说明 “int x=5,y=7,z=8;”,执行表达式 “z+=x++||y++||++z”后,则x、y、z的值分别为
A.6、7、9 B. 6、8、10 C. 6、8、8 D. 6、8、1
答案为:A。按照逻辑或(||)运算的优化,只有当左操作数值为0时才计算右操作数的值。表达式中涉及了自增、逻辑和赋值三种运算,按照优先级首先计算自增运算x++,取出x的值5参加运算,然后x自增1为6;所以第一个自增表达式的值为5,就不再计算后面的两个自增表达式了,直接得到整个逻辑表达式的值为1,通过复合赋值操作赋给z,所以z的值为9。
4.设有语句 “int a=258,b; unsigned char c; b=c=a; “,则b的值是 。
a为整型数,占用4个字节的存储空间,在系统中存储为00000000 00000000 00000001 00000010,c为无符号的字符型,占用一个字节的内存空间。将变量a的值赋给变量c, 只能将a的低8位赋给变量c,所以c的值为00000010,转化为十进制数为2。再将c的值赋给变量b,所以b的值为2。
5.设有语句 “char s[]= “Rep\0Ch”;int m=sizeof(s);”,则m的值是 。
答案为:7。 sizeof()运算符是用来用来计算某种类型或数据所占用的字节数,s所占用的字节数由字符中所含字符的个数加上字符串的结束标记,所以m的值是7。
6.设有四个常数:①4e0.5,②‘\87’,③0x5a,④“\””,其中符合C++语法规则的常量是
A.②③ B.②④ C.③④ D.①②
答案为:C。其中①式指数部分必须是整数,②转义字符序列中八进制值只允许出现数字0-7。所以只有③和④是合法的。
7.能用作用户自定义的标识符为
A.friend B. –var C. 3Xyz- D. Float
答案为:D。按照标识符的命名规则,选项(A)为关键字,选项(B)以短横线开始,选项(C)中含有短横线。由于在C++中是严格区分大小写的,所以 “Float” 和 “float”是两个不同的符号,float是关键字,而Float则是合法的标识符。
三、实验内容
1.有如下程序:
#include <iostream.h>
void main(void){
int a=1,b=3,c=2;
int sum;
sum=a1+b+c
cout<<"a="<<a<<"\tb="<<b<<"\tc="<<c<<"\tsum="<<sum<<endl;
}
请回答以下问题:
①编译上述程序后,在“output”输出窗口显示有 行错误;
②第一行的错误信息为 ;可翻译成 ;因此,针对该错误提示,我们应将第 行语句修改为 。
③第二行的错误信息为 ;可翻译成 ;因此,针对该错误提示,我们应将第 行语句修改为 。
④上述两步完成后再编译,则在输出窗口显示的信息为 。
⑤该程序运行的结果是
⑥针对上述错误,我们得出的结论是
2.有如下程序:
#include <iostream.h>
void main(void){
sum=a+b;
int a=1,b=3,c;
int c=a+b+sum;
cout<<"a="<<a<<"\tb="<<b<<"\tsum="<<sum<<endl;
}
请回答以下问题:
①编译上述程序后,在“output”输出窗口显示有 行错误;
②第一行的错误信息为 ;可翻译成 ;第二行的错误信息为 ;可翻译成 ;第三行的错误信息为 ;可翻译成 ;因此,针对上述错误提示,我们应这样修改:
③第四行的错误信息为 ;可翻译成 ;因此,针对该错误提示,我们应将第 行语句修改为 。
④该程序运行的结果是
⑤针对上述错误,我们得出的结论是
3.有如下程序:
#include <iostream.h>
void mian(void){
int a,b,t;
cin>>a>>b;
t=a*b;
cout<<"a="<<a<<'\t'<<"b="<<b<<"\t="<<t<<endl;
}
请回答以下问题:
①编译上述程序后,在“output”输出窗口显示有 行错误;该错误信息为 ;可翻译成 ;因此,针对该错误提示,我们可这样修改: 。
②该程序运行的结果是
③针对该错误,我们得出的结论是
4.有如下程序:
#include <iostream.h>
void main(void){
int a=1,b=3,c;
c+1=a+b;
cout<<"c="<<c<<endl;
}
请回答以下问题:
①编译上述程序后,在“output”输出窗口显示有 行错误;该错误信息为 ;可翻译成 ;因此,针对该错误提示,我们可这样修改: 。
②该程序运行的结果是
③针对该错误,我们得出的结论是
6
展开阅读全文