做题笔记 2019/9/30

1.类型安全:如果两个类型直接要相互转换,必须要显示的转换,不能偷偷摸摸的只用一个等于号就隐式转换了。

2.math.h中的abs的返回值正数负数都有可能,因为负数的范围比正数大一个,比如8位的二进制,可以表示范围为-128~127所以abs(-128)可能并不能表示为128。

3.先说宏和函数的区别:
3.1. 宏做的是简单的字符串替换(注意是字符串的替换,不是其他类型参数的替换),而函数的参数的传递,参数是有数据类型的,可以是各种各样的类型.
3.2. 宏的参数替换是不经计算而直接处理的,而函数调用是将实参的值传递给形参,既然说是值,自然是计算得来的.
3.3. 宏在编译之前进行,即先用宏体替换宏名,然后再编译的,而函数显然是编译之后,在执行时,才调用的.因此,宏占用的是编译的时间,而函数占用的是执行时的时间.
3.4. 宏的参数是不占内存空间的,因为只是做字符串的替换,而函数调用时的参数传递则是具体变量之间的信息传递,形参作为函数的局部变量,显然是占用内存的.

3.5. 函数的调用是需要付出一定的时空开销的,因为系统在调用函数时,要保留现场,然后转入被调用函数去执行,调用完,再返回主调函数,此时再恢复现场,这些操作,显然在宏中是没有的.

4.内联函数与宏的区别:

4.1.内联函数在运行时可调试,而宏定义不可以;
4.2.编译器会对内联函数的参数类型做安全检查或自动类型转换(同普通函数),而宏定义则不会; 
4.3.内联函数可以访问类的成员变量,宏定义则不能; 
4.4.在类中声明同时定义的成员函数,自动转化为内联函数。

5.字符串的两种初始化,1 char[20] = "hello world"; char *str = "hello world";

6.rewind()函数,将文件指针指向文件开头的位置。

7.一个算法有0个或多个输入 有一个或多个输出。

8.

若有以下定义和赋值语句,则与&s[i][j]等价的是

1

2

3

int s[2][3] = {0}, (*p)[3], i, j;

p = s;

i = j = 1;

 

首先p是一个指向有三个元素的数组的指针,p = s,说明p指向s的第一行,*(p + 1)表示指向数组的第二行第一个元素,*(p + 1) + 1表示指向数组第二行第二个元素,所以答案是*(p + i) + j。

9.char类型是无符号还是有符号取决于具体的实现,arm-linux-gcc 规定 char 为 unsigned charvc 编译器、x86上的 gcc 规定 char 为 signed char缺省情况下,编译器默认数据为signed类型,但是char类型除外。 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章