1,#include的<>和""
对于#include而言,后面的文件所使用的是双引号或尖括号。
- 双引号:表示寻找被包含文件的方式是现在源程序所在的目录中搜索;如果搜索不到,则按系统设定的标准方式搜索目录。
- 尖括号:仅仅搜索系统指定目录。
2,const函数特点
- 不能在const函数中修改所在类的对象的数据,因为const函数中的
*this
是常量,同样只能访问const函数; - const函数与同名的非const函数是重载函数;
- const对象只能调用const函数 ,但是非const对象可以调用const函数。
- 之所以const函数中只能调用其他的const函数,不能调用非const函数,因为对象调用函数是需要传递对象自己,const函数中的
*this
是常量,非const函数中的*this
是变量,因此不可以调用(除非去除*this
的const属性);
注:使用const_cast后,可以在const函数中调用非const函数。
3,字符串赋值问题
对于问题:
在c语言中,下面能正确进行字符串赋值操作的是?
1,char s[5]={"ABCDE"};
这个赋值是错误的,因为s定义为5个元素的字符型数组,即最多能存放5个字符,而字符串结尾’\0’无法存放。
2,char *s; scanf("%s",s);
这个赋值也是错误的,因为此时是“野指针”赋值,而野指针赋值很有可能出现问题。而之所以可能会出现问题,是因为野指针指向的位置不确定,随意更改其中的值,很有可能出错。
3,char *s;s="ABCDE";
这个赋值方法就是正确的了。先定义字符指针s,而后将字符串"ABCDE"的首地址赋值给指针变量s,是正确的赋值。
4,指针指向同一地址的思考
对于问题:
当参数*x=1, *y=1, *z=1时,下列不可能是函数add的返回值是多少?
int add(int *x, int *y, int *z){
*x += *x;
*y += *x;
*z += *y;
return *z;
}
这道题看起来有点莫名其妙,其实考虑的是,对于指针x、y、z,这三个参数所指向的是否是同一个地址(或者说,调用该函数时,实参是不是一样的):
设a = b = c = 1,那么:
add(&a,&a,&a) 与 add(&a,&b,&c)在*x,*y,*z上是一样的,但是返回值的结果却是不同的。
最后的返回结果一共有以下五种情况:
因此,返回值可能是4,5,6,8,唯独不可能是7。
5,结构化程序设计
结构化程序设计的目的:
- 通过设计结构良好的程序,以程序静态的良好的结构保证程序动态执行的正确性,使程序易理解、易调试、易维护,以提高软件开发的效率,减少出错率。
6,赋值语句问题
- 强制类型转换,其格式为:
(类型说明符)(表达式)
其中,类型说明符和表达式都必须加括号(单个变量可以不加括号)。 k = 2*4, k*4
;
上面这种语句的写法是正确的,这是C语言中的逗号表达式。其中,k的值为8,而上面整个式子的值为32,即如果有:
a = (k = 2*4, k*4)
,则a的值就位32。
c语言提供一种特殊的运算符,逗号运算符,优先级别最低,它将两个及其以上的式子联接起来,从左往右逐个计算表达式,整个表达式的值为最后一个表达式的值。
7,构造函数与析构函数的调用顺序
对于问题:
Class A;
Class B;
void F() {
A a;
B b;
}
在函数F中,本地变量a和b的构造函数(constructor)和析构函数(destructor)的调用顺序是什么?
- 在一般情况下,调用析构函数的次序正好与调用构造函数的次序相反,即先构造的后析构,后构造的先析构。
- 按变量声明顺序构造对象,然后入栈。
- 按相反顺序出栈,析构对象。
因此,这道题的答案为:
a构造 b构造 b析构 a析构
8,C语言的基础特点
C语言是介于汇编语言和高级语言之间的一种语言,由于它可以直接访问物理地址,对硬件操作,所以C语言既可以编写应用程序,又可以开发系统软件,而且C语言程序可移植性好于汇编语言,程序清晰,具有模块化的特点,是一种结构式模块化的设计语言。
9,变量初始化的方式
对于一个整型变量,我们在对其初始化时,可以直接赋值:
int a = 5;
也可以使用如下的方法:
int a(5);
10,字符数组的输入
对于题目:
若char a[10],则如何从键盘上输入数据到a数组中?
方法1:
gets(a);
gets()函数用于从缓冲区中读取字符串,其原型如下:
char *gets(char *string);
gets()函数从流中读取字符串,直到出现换行符或读到文件尾为止,最后加上NULL作为字符串结束。所读取的字符串暂存在给定的参数string中。
【返回值】:若成功则返回string的指针,否则返回NULL。
方法2:
scanf("%s", a);
方法3:
for(i=0;i<10;i++) a[i]=getchar();
函数getchar()用于从标准输入控制台读取字符,原型如下:
int getchar(void);
【参数】:该函数没有参数。
【返回值】:函数的返回值为用户输入的第一个字符的ASCII码,若出错返回-1,且将用户输入的字符回显到屏幕。如果用户在按回车键之前输入了不只一个字符,其他字符会保留在键盘缓冲区中,等待后续getchar()调用读取。 也就是说,后续的getchat()调用不会等待用户按键,而是直接读取缓冲区中的字符,直到缓冲区的字符读取完毕后,才等待用户按键。
而诸如:a = getcgar();
的写法,自然就是错误的了,因为getchar不管输入的字符串有多长,每次都只能获取一个字符变量。