单元二 -函数和编译处理

来源:互联网 发布:大数据提供价格 编辑:程序博客网 时间:2024/05/16 18:16

单元二 -函数和编译处理

知识点提问

1.函数的划分原则是什么?主函数的设计原则是什么?
答:1·系统函数库函数/2用户自定义的函数。主函数的设计原则是函数的功能要单一,不要设计多用途的函数,入口只有一个。

2.一个函数的功能是多好,还是烧好,最好是单一功能?
答:一个函数的功能越少越好,最好是单一功能。

3.什么是库函数?它是从哪里来的?你可以使用库函数吗?
答:库函数是系统函数,是编译系统提供的,用户不需定义可以去使用。

4.函数类型(返回类型)是什么意思?
答:通过函数的条用使得主调函数能得到一个确定的值,这是函数的返回值。返回类型,就是返回那个确定的类型的值。

5.函数必须有返回值吗?最多能有几个返回值?怎么返回一个值?
答:不必一定有返回值,最多只能一个返回值。用return函数返回那个值。

6.函数是如何将在该函数体中定义的局部变量返回给调用处的?
答:使用指针或者引用。

7.函数头(首部)包含那些要素?
答:类型名,函数名,形参列表*

8.函数原型是什么?函数声明是什么?函数的定义是什么?
答:函数原型类似函数定义时的函数头,又称函数声明,函数原型就是没有函数声明的形参,是一个函数的最基本的原型。函数声明是:是在函数未定义的时候,事先将该函数的有关信息通知编译系统,以便使编译能正常运行。函数定义是指对函数功能的确定,包括指定函数名,函数类型,形参以及其类型、函数体等,他是一个完整的函数单位。声明也起个对照的作用,检查函数名是否正确,实参与形参的类型的个数是否一致。

9.什么是函数参数的单向传递?
答:函数的值可以传递给被调用函数,被掉用函数只能设置一个返回值。参数可以到却不能返回。除非,传地址,引用,传值。

10.形参可以有缺省值,它的作用是什么?
答:无需指定该参数,函数可以调用,可以多个函数重构。

11.可以给函数的一部分形参赋缺省值吗?给形参赋缺省值有什么规定?
答:可以给一部分形参缺省值。规定:调用时只能从最后一个参数开始进行省略,换句话说,如果你要省略一个参数,你必须省略前面所有的参数。缺省值的参数必须放在最后面,必须是常量,必须通过值参或参传递。

12.形参缺省值可以在定义函数时赋予吗?可以在声明函数时赋予吗?可以在定义和声明俩处同时赋予吗?
答:可以在定义的时候赋予,能在声明的时候赋予。不能同时赋予,具有唯一性。

13.什么是引用?如何定义引用?引用关系建立后还可以改变吗?
答:c中引用是别名,把地址传到被调用函数的形参。定义引用是使用‘&’。建立后不能改变。

14.引用作为函数的形参,属于单项传递还是双向传递?为什么?
答:属于双向传递,被掉函数引用主调函数的地址,被调函数的引用的数变了,在主函数的值也会变。

15.什么是变量的生存期(生命期)和作用域(可见性)?举例说明变量的生存期和作用域相同及不同的情况。
答:变量的生存期是在那个范围类,函数有个作用范围。这个变量的存在这关于全局变量和局部变量。全局变量在整个程序里面存在,但是在一个函数中,若有全局变量和局部变量,是局部变量起作用。

16.什么是全局变量?它何时诞生(创建)?何时消亡(被删除)?
答:全局变量可以在任何地方都可以被调用。可以在本程序任何地方创建。程序结束才会被删除。

17.全局变量无论在程序中什么位置定义,都可以被程序的所有部分访问到吗?
答:可以。全局变量和局部变量重名,全局变量会被屏蔽掉。

18.限制使用(不得滥用)全局变量的理由是什么?
答:小程序没有事情,但是大程序会很危险,减少变量使用,容易犯错。不经济,不安全,影响代码可读性。

19.全局变量与局部变量同名时,访问的是哪一个?
答:局部变量

20:VC++把内存分为那五个区?各区的用途是什么?
答:五个区:C++中,内存分为5个区:堆、栈、自由存储区、全局/静态存储区和常量存储区。
[栈区存放局部数据* ,如函数参数、函数内的局部变量等。函数执行结束时,局部数据占用的栈内存被自动释放。栈是机器系统提供的数据结构,计算机会在底层对栈提供支持:它会分配专门的寄存器(如SP)存放栈的地址,而且压栈出栈由专门的指令来执行,所以对栈的操作效率会比较高。但是栈区的容量有限。]
[堆区提供动态内存,供程序随机申请。程序员通过new操作符从堆上申请内存,通过delete操作符释放动态申请的堆内存。如果由new动态申请的内存在使用完之后没有释放,则此块内存无法再次分配,这种情况称之为内存泄露(memory leak)。没有释放的堆内存,直到整个程序结束运行之后,由操作系统自动回收。]
[常量存储区:这是一块特殊存储区,里边存放常量,不允许修改]
[全局/静态存储区:全局变量和静态变量被分配到同一块内存中(在C语言中,全局变量又分为初始化的和未初始化的,C++中没有这一区分]
[自由存储区:是由malloc等分配的内存块,和堆十分相似,用free来释放。]

21.extern 变量的用途是什么?
答:extern是声明外部变量。全局变量(外部变量)是在函数的外部定义的,它的作用域为从变量的定义处开始,到本程序的末尾。在此作用域内,全局变量可以为本文件中各个函数所引用。编译时,将全局变量分配在静态存储区。有时需要用extern来声明全局变量,以扩展全局变量的作用域**

22.什么是static变量?它有什么特点?
答:设置的外部变量只能被本文件引用,而不能被其他文件引用。静态外部变量。
特点:静态局部变量在函数类定义。静态局部变量虽然生存期为整个源程序,但是其作用域仍与自动变量相同,即只能在定义该变量的函数内使用改变量。允许对构造变量里赋初值,若未赋初值,系统自动赋值,数值类型变量自动赋值0,字符量自动赋空值。

23.如何定义不允许项目的其他单元文件使用全局变量?
答:static静态变量。

24.什么是外部函数和内部函数?分别如何定义?
答:外部函数是在文件外的函数,内部函数是只能本文件的其他函数所调用的的函数。外部函数,最左端冠以extern,内部函数是static函数。

25.栈是一种什么样的数据结构?画出其示意图。
答:栈(stack)又名堆栈,它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。
zhan.

26.vc++系统默认大小为1MB,可以调整其大小吗?如何调整?
答:可以。[工程]-[设置]–[连接]–[分类]–[输出]–[堆栈分配]

27.参数传递时,函数实参是存储在什么地方?如何与形参结合(赋值)?
答:[形参:在被调函数形参表中的变量名、数组名,该过程在被调用前,没有为它们分配内存,其作用是说明自变量的类型和形态以及在过程中的作用。
形参可以是 合法变量名,数组名
实参:从主调过程传递给被调用过程的参数值。实参可以是变量名、数组名、常数或表达式。在过程调用
传递参数时,形参与实参是按位置结合的,形参表和实参表中对应的变量名可以不必相同,但它们的数据类型、参数个数及位置必须一一对应
两者关系:
1. 形参只能是变量,实参可以是常量、变量或表达式。在被定义的函数中,必须指定形参的类型。
2. 实参与形参的个数应一样,类型应一致。字符型和整型可以互相通用。
3. 在调用函数时,如果实参是数组名,则传递给形参的是数组的首地址
4.实参传递给形参是单向传递,形参变量在未出现函数调用时,并不占用内存,只在调用时才占用。调用结束后,将释放内存。执行一个被调用函数时,形参的值如果发生改变,并不会改变主调函数中的实参的值。
5.形参如同公式中的符号,实参就是符号具体的值,在调用过程前必须得到赋值;调用过程就是实现形参与实参的结合,把实参的值通过调用传递给形参,相当于把值代入公式进行计算。]

28.充分理解函数调用与系统栈的变化过程?
答:[函数调用,系统栈](http://blog.chinaunix.net/uid-20718384-id-3418279.html)

29.什么是inline函数?它如何提高函数调用的效率?它的使用场合是什么?为什么?定义inline函数有什么条件?是否使用了inline关键字,它就是inline函数了?
答:inline函数是内联函数。在程序编译时,编译器将程序中出现的内联函数的调用表达式用内联函数体来进行替换。(这种做法不会产生转来转去的问题,但是由于编译时将函数体中的代码被替换到程序中,因此中,因此会增加目标程序的代码量,进而增加空间开销。而在时间代销商不像函数调用时那么大–以空间换时间。定义时,只要函数定义的头前加上inline的关键字。必须与函数顶一体放在一起才能内联,放在函数声明钱不行/类在声明中的成员函数将自动地成为内联函数,public/

30.什么是递归函数?什么是间接递归和直接递归?
答:递归函数自己调用自己的函数。直接是嵌套,自己调用自己,间接是A调B,B调A。

31.递归函数有什么缺点,以至于最好不用递归函数?
答:时间空间消耗大。每一次调用需要在内存栈分配空间以保存参数。栈容易溢出。

32.怎么把一个递归函数写成一个非递归函数?
答:通过使用循环,每次循环,那段语句又重新循环。

33.函数重载有什么作用?定义重载函数有那些规定?
答:方便功能类似,但是类型不同的函数,对一个函数名重新赋予新的含义,一函数多用。规定1.不能改变运算符的优先级,2不能改变运算符的结合型。3默认参数和重载运算符一起使用。4,不能改变运算符的操作数的个数。5.不能创建新的运算符,只有已有运算符可以被重载。6运算符作用于c++内部提供的数据类型,原来含义保持不变。

34.重载函数的形参带默认值时,很容易导致二义性错误,应如何避免?
答:如果使用“默认参数”就不要使用“函数重载”/

35.函数模板的参数类型可以一部分为泛类型,一部分为实际类型吗?
答:可以。

36.函数模板的泛类型只能有一个吗?
答:不是,可以有多个。

37.函数模板可以与函数模板重载吗?如何区分它们?
答:可以。[1 函数模板可以像普通函数一样被重载
2 C++编译器优先考虑普通函数
3 如果函数模板可以产生一个更好的匹配,那么选择模板
4 可以通过空模板实参列表的语法限定编译器只通过模板匹配] 参数

38.函数模板可以与非函数模板重载吗?
答:可以。

39.编译预处理简称预处理,预处理的命令是c++语句吗?
答:不是语句。预处理指令是我们写在程序代码中的给预处理器(preprocessor)的 命令,而不是程序本身的语句。预处理器在我们编译一个C++程序时由编译器自动执行,它负责控制对程序代码的第一次验证和消化。

40.预处理命令以#开头,它可以跨行且用分号结束吗?
答:不行,他不是语句。

41.预处理有什么作用,它在程序运行时被执行吗?
答 :C++的预处理(Preprocess),是指在C++程序源代码被编译之前,由预处理器(Preprocessor)对C++程序源代码进行的处理。这个过程并不对程序的源代码进行解析,但它把源代码分割或处理成为特定的符号用来支持宏调用。

42.对于数值常量,用#define宏定义好,还是用const定义好,为什么?
答:用define定义好,方便维护,[define宏定义和const常变量区别:
1.define是宏定义,程序在预处理阶段将用define定义的内容进行了替换。因此程序运行时,常量表中并没有用define定义的常量,不为它分配内存
const定义的常量,在程序运行时在常量表中,系统为它分配内存。
2.define定义的常量,预处理时只是直接进行了替换。所以编译时不能进行数据类型检验。
const定义的常量,在编译时进行严格的类型检验,可以避免出错。
3.define定义表达式时要注意“边缘效应”]

43.对于简单函数,可用带参数的宏定义或定义为inline函数,那个更好?
答:inline更好吧![总结inline函数与宏定义的区别:
1、内敛函数在编译时展开,而宏是在预编译时就展开了
2、在编译时内敛函数可以直接被嵌入到目标函数代码中,而宏只是一个简单的文本替换
3、内敛函数可以完成诸如类型的检测、语句是否正确等编译功能,宏就不具备这种功能
4、宏不是函数,而inline函数是函数
5、宏在定义时要小心处理宏参数,(一般情况是把参数用括弧括起来)。]
**[内联函数的优越性:
一:inline定义的类的内联函数,函数的代码被放入符号表中,在使用时直接进行替换(像宏定义一样展开),没有了调用的开销,效率很高。
二:类的内敛函数是一个真正的函数。
三:使用内联函数inline可以完全取代表达式形式的宏定义。]**

44.预处理#include命令的作用是什么?
答:#include指令,即文件包含指令用于编译期间把指定文件的内容包含进当前的文件中,这是通过预处理器提供的语言功能,是比较常用的预处理器指令。

45.#include<文件名>和#include“文件名”的区别?
答:第一个是首先在编译器默认的include目录下寻找该头文件,一般使用编译器提供的函数库就用这个包含。另一个是当前目录,寻找该头文件,一般自己定义的头文件就用这个。

46.被包含文件里用static定义的全局变量或函数可以在#include它的文件内使用吗?
答:不能。静态文件只能本文件使用。

47.什么是条件编译?为什么使用条件编译?
答:一般情况下,源程序中所有的行都参加编译。但有时希望对其中一部分内容只在满足一定条件下才进行编译,即对一部分内容指定编译条件,这就是“条件编译”(conditional compile)。条件编译语句排版时,需考虑以下三种位置:1)条件编译语句块与函数定义体之间不存在相互嵌套(主要在(.h)文件中);2)条件编译语句块嵌套在函数体之外(主要在(.c)文件中);3)条件编译语句嵌套在函数体内 (主要在(.c)文件中)。条件编译指令将决定哪些代码被编译,而哪些是不被编译的。可根据表达式的值或某个特定宏是否被定义来确定编译条件。
编译不同平台的一个软件*

48.条件编译的“条件”必须是常量表达式吗?
答:不是。a.#ifdef 标识符 程序段1#else 程序段2#endif
它的功能是,如果标识符已被 #define命令定义过则对程序段1进行编译;否则对程序段2进行编译
b.表达方式:

#ifndef 标识符  程序段1#else  程序段2#endif

c.

#if 常量表达式  程序段1#else  程序段2#endif它的功能是,如常量表达式的值为真(非0),则对程序段1 进行编译,否则对程序段2进行编译。因此可以使程序在不同条件下,完成不同的功能

49.理解条件编译的集中形式及变形:#if-#endif,#if-#else-#endif,#ifdef-#else-#endif,#ifndef-#else-#endif?
答:条件编译

50如何用条件编译防止多文件包含时的重复定义问题?
答:满足条件才定义,才编译就不会重复定义。
//meta http-equiv=”refresh” content=”5.0”>

0 0