面向对象程序设计——Visual C++
第1章 C++的基本知识

思考题

1、C++中有那些基本数据类型?

  1. 整型 (int)
  2. 短整型 (short)
  3. 长整型 (long)
  4. 无符号整型 (unsigned int)
  5. 无符号短整型 (unsigned short)
  6. 无符号长整型 (unsigned long)
  7. 浮点数 (float)
  8. 双精度浮点数 (double)
  9. 布尔类型 (bool)
  10. 字符型 (char)
  11. 宽字符型 (wchar_t)
  12. 空类型 (void)

2、转义字符的作用是什么?试列举常用的转义字符及其作用。

转义字符是一些特殊的字符序列,用于表示一些特殊的字符或控制字符。它们通常以反斜线(\)开头,紧跟着一个或多个字符。 常用的转义字符及其作用如下:

  1. \n:表示换行符。
  2. \t:表示制表符。
  3. \r:表示回车符。
  4. \b:表示退格符。
  5. \f:表示换页符。
  6. \\:表示反斜线本身。
  7. ':表示单引号。
  8. ":表示双引号。
  9. \0:表示空字符。
  10. \xhh:表示一个十六进制的字符。
  11. \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.4E382.2E-308~1.8E3083.4E-4932~1.1E4932
字符型包括char类型,取值范围为-128~1270~255
布尔型包括bool类型,取值范围为truefalse
空类型包括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