面向对象程序设计——Visual C++
第1章 C++的基本知识
思考题
1、C++中有那些基本数据类型?
- 整型 (int)
- 短整型 (short)
- 长整型 (long)
- 无符号整型 (unsigned int)
- 无符号短整型 (unsigned short)
- 无符号长整型 (unsigned long)
- 浮点数 (float)
- 双精度浮点数 (double)
- 布尔类型 (bool)
- 字符型 (char)
- 宽字符型 (wchar_t)
- 空类型 (void)
2、转义字符的作用是什么?试列举常用的转义字符及其作用。
转义字符是一些特殊的字符序列,用于表示一些特殊的字符或控制字符。它们通常以反斜线(\)开头,紧跟着一个或多个字符。 常用的转义字符及其作用如下:
- \n:表示换行符。
- \t:表示制表符。
- \r:表示回车符。
- \b:表示退格符。
- \f:表示换页符。
- \\:表示反斜线本身。
- ':表示单引号。
- ":表示双引号。
- \0:表示空字符。
- \xhh:表示一个十六进制的字符。
- \uhhhh:表示一个 Unicode 字符。
通过使用这些转义字符,我们可以在程序中正确地表示一些特殊的字符或控制字符,避免了因为这些字符对程序的运行产生不良影响的问题。
3、前置与后置的自增自减运算符的区别是什么?
前置自增自减运算符(++i,--i):先执行加1或减1的操作,然后再将变量的值赋给表达式。
后置自增自减运算符(i++,i--):先将变量的值赋给表达式,然后再执行加1或减1的操作。
因此,区别在于前置自增自减运算符的值是已经加1或减1后的结果,而后置自增自减运算符的值是加1或减1前的原始值。同时,前置自增自减运算符的执行速度要略快于后置自增自减运算符,但在大多数情况下,两者的性能影响不大。
习题
1、下列常数中哪些是合法的?若合法,指出常数的类型,若不合法,说明原因。
+3 -0 0379 00014 0x123e e5 3e 1e-3 1.45e4.0 1.23 .3 12. ‘\t’ ‘a’‘ab’ ‘\85’ ‘\x60’ “Hello,China!” “I’m a student” 23u 5L 12.3u 12.3l 87Ul
合法常数:
+3(int)
-0(int)
0379(八进制,int)
00014(八进制,int)
0x123e(十六进制,int)
e5(科学计数法,double)
3e(错误的科学计数法,不合法)
1e-3(科学计数法,double)
1.45e4(科学计数法,double)
1.23(double)
.3(double)
12.(double)
‘\t’(char)
‘a’(char)
‘\85’(八进制转义,char)
‘\x60’(十六进制转义,char)
“Hello,China!”(字符串)
“I’m a student”(字符串)
23u(unsigned int)
5L(long)
12.3u(无效后缀,不合法)
12.3l(long double)
87Ul(unsigned long)。
不合法的常数:
- 3e: 科学计数法必须要有指数部分。
- 12.3u: 后缀u不适合用于表示浮点数。
- 87Ul": 后缀Ul不是任何已知数据类型的有效后缀。
2、在C++中,下列符号中哪些是合法的标识符?
abs3 3block a+b _else Class sum a_bc for my_class fun(4) a-bc
合法的标识符:abs3、_else、Class、sum、a_bc、for、my_class。
不合法的标识符:3block(不能以数字作为开头)、a+b(不能使用加号作为标识符的一部分)、fun(4)(不能使用括号作为标识符的一部分)、a-bc(不能使用减号作为标识符的一部分)。
3、在C++中,下列定义变量和常量的方法中哪些是错误的,如何修改?
(1)int i,j=10,k;
(2)float i,j,int k;
(3)const int i;
(4)const k=10;
(5)#define PI=3.14159
(6)int i,j; int i;
答:
(1) 正确。定义了三个int类型的变量i、j、k,并初始化j为10。
(2) 错误。不能同时定义不同类型的变量,应该写成float i,j; int k;。
(3) 错误。const修饰的变量必须进行初始化,应该写成const int i=0;。
(4) 错误。const修饰的变量必须进行初始化,应该写成const int k=10;。
(5) 错误。宏定义中不应该有“=”号,应该写成#define PI 3.14159。
(6) 错误。同一个作用域中不能定义同名的变量,应该修改为int i, j; 或者删除一行int i;。
4、在C++中,下列符号中,哪些表示字符,哪些表示字符串,哪些两者都不是?
‘a’ ‘ab’ ‘0x70’ abc “计算机” 45.6 “\0x54” “a” “\a” ‘\n’ “\n\\67” ‘56.3’
‘a’ 表示字符。
‘ab’ 和 ‘0x70’ 都不是字符,也不是字符串,因为它们包含多个字符和数字。
abc 是字符串。
“计算机” 是字符串。
45.6 不是字符或字符串,它表示一个浮点数。
“\0x54” 表示一个字符串,其中包含转义字符“\0”和“\x54”,后者表示字母“T”。
“a” 表示一个字符。
“\a” 表示转义字符“\a”,在输出时会发出警报声。
‘\n’ 表示换行符。
“\n\\\67” 表示两个转义字符“\n”和“\\\67”,后者表示ASCII码为67的字符“C”。
‘56.3’ 不是字符或字符串,它表示一个浮点数,且单引号只能用来表示单个字符。最后的引号少了一个,应该是“'56.3'”。
5、在C++中,下列式子中,哪些是合法的表达式,哪些不是,为什么?
(1)4*2.5%3
(2)7%2.5*4
(3)8.2/3%2
(4)x+=y*=z+3
(5)x=y+z=4
(6)5=2+3
(7)123.4>>2
(8)123<<2
(9)123<<2.5
(10)a+++b
(11)a+++++b
(12)++5
(1) 合法。先计算4*2.5=10,再取余3,结果为1。
(2) 不合法。取模运算和乘法运算的优先级相同,但是%和*都是左结合的,即从左往右计算,所以应该先计算7%2=1,再计算1*4=4。但是2.5不是整数,所以这个表达式是不合法的。
(3) 合法。先计算8.2/3=2,再取余2,结果为0。
(4) 合法。先计算z+3,再把y乘以(z+3),最后把结果加到x上。
(5) 不合法。一个赋值语句不能同时给多个变量赋值。应该拆成两句赋值语句,分别给x和y+z赋值为4。
(6) 不合法。一个数字不能作为左值,即不能赋值给数字。正确的表达应该是5=2+3。
(7) 不合法。位移运算只能用于整数,而且右移运算符>>要求右操作数必须是整数,所以这个表达式不合法。
(8) 合法。左移运算可以用于整数和浮点数,这个表达式等价于123*2^2=492。
(9) 不合法。左移运算的右操作数必须是整数,所以这个表达式不合法。
(10) 合法。这个表达式相当于在求a+b之后再把a加1。
(11) 不合法。C++中不允许对数字常量进行自增运算,所以这个表达式不合法。
(12) 不合法。字符串不能被自增,所以这个表达式不合法。
在C++中,设有如下的变量说明:
int a=2,b=5,c=9;
float x=2.3,y=4.5,z=6.0;
char ch1=’a’,ch2=’b’;
加适当的括号给出6~10题中各表达式的等价形式,并求出他们的值:
6、算术运算表达式和sizeof()运算符
(1)a+c/b*10
(2)a+z/b+x
(3)z+b%a*x+c
(4)sizeof(a+3.4)
(5)sizeof(‘a’+’b’)
(6)ch1/b+ch2
(7)++b+c
(8)++x+ ++ch1
(9)x++ +ch1
7、关系表达式
(1)d=a<=b<=c (2)d=a+b>b+c!=ch1
(3)d=a==b<c (4)d=ch1>=a+ch2<=b
8、逻辑表达式
(1)a>1&&x<=2 (2)!a+b<c+4||x>4
(3)!a--&&a>b||x (4)ch1+b>ch2&&x==y
9、赋值表达式
(1)a=b+=4 (2)a+=b*=c+ch1
(3)a+=b+(a=6) (4)d=x>y+ch2
(5)x=a=y=5.4 (6)a=y=8.5
10、逗号表达式
(1)a++,b+=a,b+c (2)x=(y=b,z=b+c)
(3)a=a+2,b++,c=b+d (4)a++,--b,a>b
6、
(1)a+((c/b)*10) = 12
(2)a+(z/b)+x = 4.3 应该为5.5
(3)z+((b%a)*x)+c = 21 应该为17.3
(4)sizeof(float) = 4
(5)sizeof(int) = 4
(6)(ch1/b)+ch2 = 99 应该为117
(7)++b+c = 15
(8)(++x)+(++ch1) = 101 应该为101.3
(9)(++x)+ch1 = 100 应该为99.3
7、
(1)d=(a<=b)&&(b<=c) = 1
(2)d=((a+b)>(b+c))||(ch1!=(a+b)) = 0
(3)d=(a==b)&&(b<c) = 0
(4)d=((ch1>=(a+ch2))&&(a+ch2<=b)) = 1
8、
(1)(a>1)&&(x<=2) = 1
(2)(!(a+b<c+4))||(x>4) = 1
(3)((!a--)&&(a>b))||x = 0
(4)((ch1+b)>ch2)&&(x==y) = 1
9、
(1)a=(b+=4)=9
(2)a+=(b*=(c+ch1))=116
(3)a+=(b+(a=6))=18
(4)d=(x>(y+ch2))=0
(5)x=(a=(y=5.4))=5.4
(6)a=(y=8.5)=8
10、
(1)(a++,(b+=a),(b+c))=18
(2)x=(y=b,z=b+c)=10.0
(3)(a=(a+2)+(b++),(c=b+d))=16
(4)(a++,--b,(a>b))=0
14、C++中有哪几种数据类型?简述其取值范围。编程显示在你所使用的计算机中各种数据类型的字节数(用sizeof())。
C++中有基本数据类型和复合数据类型两种。
基本数据类型包括整型、浮点型、字符型、布尔型和空类型。
其中,整型包括short、int、long、long long等类型,取值范围分别为-32768~32767
、-2147483648~2147483647
、-2147483648~2147483647
、-9223372036854775808~9223372036854775807
;
浮点型包括float、double、long double等类型,取值范围分别为1.2E-38~3.4E38
、2.2E-308~1.8E308
、3.4E-4932~1.1E4932
;
字符型包括char类型,取值范围为-128~127
或0~255
;
布尔型包括bool类型,取值范围为true
或false
;
空类型包括void类型,表示无类型。
复合数据类型包括数组、结构体、共用体、枚举等类型,其取值范围与其内部的基本数据类型有关。以下是在Windows系统下各种数据类型的字节数:
short:2字节
int:4字节
long:4字节
long long:8字节
float:4字节
double:8字节
long double:12字节
char:1字节
bool:1字节
void:无大小
15、用C++表达式描述下列命题:
(1)a小于b且b大于c
(2)a大于b或大于c
(3)a大于b且小于c
(4)a不能被b整除
(1) a < b && b > c
(2) a > b || a > c
(3) a > b && a < c
(4) a % b != 0
上机题:
2、分析下列程序的输出结果
#include <iostream>
using namespace std;
int main() {
char x, y;
int n;
x = 'a';
y = 'b';
n = x < y;
cout << n << endl;
n = y == x + 1;
cout << n << endl;
n = ((x < y) && (y == x + 1) + 5);
cout << n << endl;
}
结果:
1
1
1
3、分析下列程序的输出结果
#include <iostream>
using namespace std;
int main() {
int x, y, n;
x = y = 1;
n = --x && ++y;
cout << "n=" << n << " x=" << x << " y=" << y << endl;
n = (--x) || (++y);
cout << n << endl;
cout << "x=" << x << " y=" << y << endl;
}
结果:
n=0 x=0 y=1
1
x=-1 y=1
4、分析下列程序的输出结果
#include <iostream>
using namespace std;
int main() {
int x, y;
x = 3;
y = 6;
x += 3;
y *= x;
cout << "x=" << x << " y=" << y << endl;
}
结果:
x=6 y=36