含参数的宏与函数的优缺点
C语言面试题及答案

1、关键字 static 的作用是什么?这个简单的问题很少有人能回答完全。
在 C 语言中,关键字static 有三个明显的作用: 1).在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。
2).在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。
它是一个本地的全局变量。
3).在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。
那就是,这个函数被限制在声明它的模块的本地范围内使用。
大多数应试者能正确回答第一部分,一部分能正确回答第二部分,同是很少的人能懂得第三部分。
这是一个应试者的严重的缺点,因为他显然不懂得本地化数据和代码范围的好处和重要性。
2、.h 头文件中的 ifndef/define/endif 的作用?答:防止该头文件被重复引用。
3、描述实时系统的基本特性答:在特定时间内完成特定的任务,实时性与可靠性。
4、什么是平衡二叉树?答:左右子树都是平衡二叉树且左右子树的深度差值的绝对值不大于1。
5、冒泡排序算法的时间复杂度是什么?答:O(n^2)6、队列和栈有什么区别?答:队列先进先出,栈后进先出7、局部变量能否和全局变量重名?答:能,局部会屏蔽全局。
要用全局变量,需要使用"::" 局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量。
对于有些编译器而言,在同一个函数内可以定义多个同名的局部变量,比如在两个循环体内都定义一个同名的局部变量,而那个局部变量的作用域就在那个循环体内8、全局变量可不可以定义在可被多个.C 文件包含的头文件中?为什么?答、可以,在不同的C 文件中以static 形式来声明同名全局变量。
可以在不同的 C 文件中声明同名的全局变量,前提是其中只能有一个 C 文件中对此变量赋初值,此时连接不会出错。
9、do……while 和while……do 有什么区别?答前一个循环一遍再判断,后一个判断以后再循环。
宏定义的优缺点

如果某个常量或者函数名很长的时候可以用宏定义做替换,这样的话程序也会比较美观一点,可读性也大大增强了。
其实在用VC编程的时候就会遇到很多宏定义,尤其是类似“LONG,LPCTSTR”等等之类的,它们属于微软的自定义类型,但其本质上还是属于C/C++里面的那几个标准类型。
那用宏定义到底有什么好处呢?先来看一下宏的定义:用#define命令将一个指定的标识符(即宏名)来代表一个字符串。
它的一般型式为:#define 表示符字符串#define命令属于“预处理命令”中的一种。
它是由C++统一规定的,但非C++语言本身的组成部分,由于编译器无法识别他们,不能对其直接进行编译。
预处理过程必须在对程序进行词法与语义分析、代码生成与优化等通常的编译过程之前进行,经过预处理后的程序不再包含之前的预处理命令。
C++提供的预处理功能除了宏定义之外,还有以下两个:1. 文件包含(#include命令)2. 条件编译(#ifdef ….#def …. #endif命令)#define命令还可以定义带参数的宏定义,用于实现某种特定的功能,其定义型式为:#define 宏名(参数列表) 字符串例如:#define Sum(a,b) a+b不过,由于C++增加了内联函数(inline),实现起来比带参数的宏更方便,这样的宏在C++中已经很少使用了。
接下来看看宏都有什么好处:1. 提高了程序的可读性,同时也方便进行修改;2. 提高程序的运行效率:使用带参的宏定义既可完成函数调用的功能,又能避免函数的出栈与入栈操作,减少系统开销,提高运行效率;3.宏是由预处理器处理的,通过字符串操作可以完成很多编译器无法实现的功能。
比如##连接符。
但是它也有自己的缺点:1. 由于是直接嵌入的,所以代码可能相对多一点;2. 嵌套定义过多可能会影响程序的可读性,而且很容易出错;3. 对带参的宏而言,由于是直接替换,并不会检查参数是否合法,存在安全隐患。
浪潮的往年笔试

. static2.指针与数组3.字符串处理基本都是要考的。
数据结构,前两家没涉及。
浪潮的考了回溯算法,排序,二叉树查找,我做的不太好。
回忆下试题有:回溯算法:N个任务,N个工人,C[i][i]:把任务i分配给工人j所需的费用。
求费用最低的分配方法。
二叉树查找:在二叉树中找结点E,1.若该节点是叶结点,直接删除2.若该节点只有Lchild,则删除该节点,把Lchild防到原有的结点位置。
题一:strcpy(char *to,char *from)函数用于拷贝字符串void strcpy(char *to,char *from){while( );}题二:编码变换的一个题目26a2变换为666_a_2具体规则是<!--[if !supportLists]-->1.<!--[endif]-->当前字符如果不是数字,则简单复制<!--[if !supportLists]-->2.<!--[endif]-->当前字符如果是数字,字面值为N,并且有后续字符,则将后续字符重复N-1次<!--[if !supportLists]-->3.<!--[endif]-->当前字符如果是数字,但是没有后续字符,则简单复制<!--[if !supportLists]-->4.<!--[endif]-->这样,每次变换后的串为一组,组与组之间用_连接。
代码忘了,简单的C语言字符串处理,只不过对指针和串位的处理要注意。
当然,还要填写一个解码的函数语句。
题三:C++template最简单的例子。
填空题中几个有印象的。
1.语句x++,++x,x=x+1,x=1+x都是完成x的值增1的操作,请写一个具有相同功能的语句,不允许与已给出的重复(我填的x+=1,浪潮这个也考,嘻嘻)2.控制台程序的入口是main() windows程序的入口是WinMain() 3.C++类中的默认限定符是:private4.C++struct中默认的限定符是:public1:下列哪组SQL 命令全部属于数据定义语句的命令?A.CREATE ,DROP ,ALTERB.CREATE ,DROP ,SELECTC.CREATE ,DROP ,GRANTD.CREATE ,DROP ,UPDA TE2:系统故障会造成A.内存数据丢失B.硬盘数据丢失C.软盘数据丢失D.磁带数据丢失3:三个模式之间存在下列映射关系,将正确的填入括号中A.外模式/ 内模式B.外模式/ 模式C.模式/ 模式D.内模式/ 外模式4:在视图上不能完成的操作是A.更新视图B.查询C.在视图上定义新视图D.在视图上定义新的基本表5:数据库系统中产生数据不一致性的根本原因是A.没有严格保护数据B.未对数据进行完整性控制C.数据冗余D.数据存储量大6:在某个数据库中建立了表person(no,name,sex,birthday),no为表的主码,表中已有的记录如下图所示:No Name Sex Birthday1 张丽丽女1967/05/074 李方女1970/04/146 王安男1982/10/27以下四个语句中能够正确执行的插入操作是A.INSERT INTO person V ALUES(6,′王中′,′男′,′1964/03/08′)B.INSERT INTO person(name,sex) V ALUES(′王中′,′男′)C.INSERT INTO person V ALUES(2,′男′,′王中′,′1964/03/08′)D.INSERT INTO person(no,sex) V ALUES(2,′男′) 7:如果事务T获得了数据对象Q上的S 锁,则其他事务在数据对象Q上A.可加X锁B.可加S锁C.可加任何锁D.不能加任何锁8:下列短语中可以在SQL 查询时去掉重复数据的是A.ORDER BYB.DESCC.GROUP BYD.DISTINCT 9:数据库的三级模式结构之间存在着两级映像,使得数据库系统具有较高的A.事务并发性 B.数据可靠性C.数据独立性D.数据重用性10:一个数据库一般不是由独立的对象组成的,对象的聚集形式的数学意义是A.笛卡尔积B.选择C.投影D.联接11:表达式“AGE BETWEEN 18 AND 24”等价于A.AGE>18 AND G<24B.AGE>=18 AND G<24C.AGE>18 AND G<=24D.AGE>=18 AND AGE<=2412:五种基本关系代数运算是A.∪,-,×,π和σB.∪,-,∞,π和σC.∪,∩,×,π和σD.∪,∩,∞,π和σ]13:供应商可以给某个工程提供多种材料,同一种材料也可以由不同的供应商提供,从材料到供应商之间的联系类型是A.多对多B.一对一C.多对一D.一对多14:事务日志是用于保存A.程序运行过程B.数据操作C.程序的执行结果D.对数据的更新操作15:属性类型允许是基本数据类型、结构类型和集合类型的模型是A.平面关系模型B.嵌套关系模型C.复合对象模型D.分布式关系模型简答题16:事务T1、T2和T3的定义如下:T1:x:=x+1T2:x:=x*2T3:x:= 3假设x的初值为0,若允许这三个事务并发执行,试列出所有可能的调度和相应的x 值。
论述含参数的宏与函数的优缺点以及应用场合

论述含参数的宏与函数的优缺点以及应用场合本文将从以下四个方面来阐述含参数的宏与函数的优缺点以及应用场合:定义与使用、可读性、代码安全性、效率。
一、定义与使用含参数的宏是一种代码替换的方式,可以使代码简洁明了,但也可能会导致代码难以维护。
由于宏也是编译器在编译过程中替换代码的一部分,因此它们经常是很有用的,特别是在程序中需要大量重复使用相同的操作时。
但是宏也很容易让代码变得难以理解和容易出错,因为它们在编译器处理前就已经完成被替换的工作。
函数可以传递参数,通过一次定义和多次调用,达到代码复用的效果。
函数定义对于代码的修改、维护和重构来说更加简单直接,也更具有可读性。
二、可读性宏不仅仅是代码的替换,它们还可以扩展语言本身。
缺点是,宏不是函数,不能定义局部变量并为其分配内存,这可能会导致全局变量的定义和使用。
宏的使用经常会让代码变得难以读懂。
函数相比宏更加具有可读性,因为其定义和执行过程直观明了。
变量定义清晰,函数名称也比宏更具描述性,符合代码规范。
三、代码安全性宏存在着让程序员错误理解其作用,在语法上也容易出错。
虽然宏可以扩展语言本身,但也会因此而导致不必要的风险因素,比如定义了全局变量,容易和其他代码产生冲突,从而导致不稳定的结果。
函数可以通过它们返回的结果隔离变量,并且不会在编译期检查期间导致代码结构中的错误。
使用函数可以尽可能减少代码错误的风险。
此外,函数的功能相对独立,更易于维护、更新或删除。
四、效率宏在编译时被替换。
它们可以在代码中减少重复,并且在执行程序的过程中不需要额外的开销,因此,它的效率一般比函数高。
之所以函数的执行效率通常较低是因为函数调用要导致系统做额外的工作,如识别和传递参数,将控制权从调用者转移到函数中,以及将函数的返回值送回到调用者。
综上所述,宏和函数各有其优缺点。
宏的优点是速度快,定义简单,可以扩展语言本身,适用于固定的代码结构。
缺点是可读性差、维护较为困难以及潜在的代码安全问题。
c语言 宏函数

C语言宏函数一、什么是宏函数在C语言中,宏函数是一种在代码中被预先定义的简单的文本替换机制。
当代码中出现宏函数的调用时,编译器会将宏函数的名称和参数替换为宏函数定义中所指定的文本,从而实现宏函数的功能。
二、宏函数的定义和使用宏函数的定义使用#define关键字,语法格式如下:#define 宏函数名(参数列表) 替换文本其中,宏函数名是用户自定义的宏函数名称,参数列表包含宏函数的参数,替换文本是宏函数的真正执行内容。
宏函数可以在任何需要的地方使用,它的使用方式和普通的函数调用非常相似。
例如:宏函数名(参数列表)三、宏函数的优缺点3.1 优点•宏函数在编译时会进行简单的文本替换,不需要函数的调用开销,执行效率高。
•宏函数不会增加新的函数调用栈,避免了函数调用的内存开销。
•宏函数可以实现代码的重用,降低代码量,提高可维护性。
3.2 缺点•宏函数的替换是简单的文本替换,没有类型检查,可能导致参数类型不匹配的问题。
•宏函数的替换会增加代码的长度,可能导致可读性下降。
•宏函数的定义一旦出错,会在编译期间就报错,增加了调试的难度。
四、宏函数的应用场景4.1 常量定义宏函数可以用于定义常量,例如:#define PI 3.14159这样,在代码中就可以直接使用宏函数PI来表示圆周率,而不需要重复输入具体的数值。
4.2 算术运算宏函数可以用于简单的算术运算,例如:#define SQUARE(x) ((x) * (x))这样,在代码中就可以使用宏函数SQUARE来计算平方,例如:int result = SQUARE(5); // 结果为254.3 条件编译宏函数可以用于条件编译,例如:#define DEBUG#ifdef DEBUG// 执行调试相关的代码#else// 执行发布版本的代码#endif这样,可以根据是否定义了宏函数DEBUG来选择性地编译不同的代码。
4.4 字符串拼接宏函数可以用于字符串的拼接,例如:#define CONCAT(a, b) a##bchar str[] = CONCAT("Hello", "World"); // 结果为"HelloWorld"五、宏函数的注意事项•宏函数的参数使用时需要加上括号,以防止由于运算符优先级引起的错误。
计算机专业研究生复试-C语言程序设计面试简答题

C语言程序设计1.简述C语⾔采取了哪些措施提⾔执⾔效率●使⽤指针:有些程序⽤其他语⽤也可以实现,但C能够更有效地实现;有些程序⽤法⽤其它语⽤实现,如直接访问硬件,但C却可以。
正因为指针可以拥有类似于汇编的寻址⽤式,所以可以使程序更⽤效。
●使⽤宏函数:宏函数仅仅作为预先写好的代码嵌⽤到当前程序,不会产⽤函数调⽤,所以仅仅是占⽤了空间,⽤使程序可以⽤效运⽤。
在频繁调⽤同⽤个宏函数的时候,该现象尤其突出。
函数和宏函数的区别就在于,宏函数占⽤了⽤量的空间,⽤函数占⽤了时间。
●使⽤位操作:位操作可以减少除法和取模的运算。
在计算机程序中数据的位是可以操作的最⽤数据单位,理论上可以⽤"位运算"来完成所有的运算和操作。
灵活的位操作可以有效地提⽤程序运⽤的效率。
●将汇编指令嵌⽤到C 语⽤程序中,汇编语⽤是效率最⽤的计算机语⽤,因此在C语⽤程序中嵌⽤汇编,从⽤充分利⽤⽤级语⽤和汇编语⽤各⽤的特点。
●系统调用:在C语⽤程序中可以调⽤操作系统级的API,从⽤提⽤程序的运⽤效率。
●条件编译:C语⽤源程序中加上条件编译,让编译器只对满⽤条件的代码进⽤编译,将不满⽤条件的代码舍弃,可以减少编译及执行程序代码量。
●循环嵌套中将较长循环设为内置循环,较短循环设为外置循环,以减少cpu跨切循环层的次数,提⽤程序的运⽤效率。
(操作系统页⽤置换相关,减少页⽤置换次数)●其它诸如寄存器变量、联合体、编译器优化等手段提⽤执⽤效率。
2.if…else和switch区别总结:都是条件选中语句。
但switch语句只能取代if语句的一部分功能。
●比较的范围不同:if 语句可做各种关系比较(只要是boolean 表达式都可以用if 判断)switch语句只能做等式比较,即只能对基本类型进行数值比较。
(switch只能做几个数据类型的等式比较,实现非等式效率低,)switch之后括号内的表达式只能是整型(byte、short、char和int)、枚举型或字符型表达式,不能是长整型或其他任何类型。
论述含参数的宏与函数的优缺点以及应用场合

论述含参数的宏与函数的优缺点以及应用场合随着计算机技术的不断发展,程序设计语言也在不断地更新和完善。
在程序设计中,常常需要使用宏和函数来实现代码的重用和模块化。
宏和函数都是程序设计中常用的工具,但它们各自有其优缺点和应用场合。
一、宏的优缺点宏是一种预处理指令,它可以将代码片段替换为一个表达式或语句。
宏的优点在于它可以将代码段直接嵌入到程序中,从而在代码执行时减少函数调用的开销。
同时,宏也可以在编译时进行宏替换,从而可以在运行时减少代码大小。
此外,宏也可以使用参数来实现代码的通用性和灵活性,从而可以在不同的场合中使用。
宏的缺点在于它容易出错,因为它不像函数一样有明确的作用域和返回值。
宏的代码段被直接嵌入到程序中,容易造成变量名和函数名的重复定义,从而导致程序的运行错误。
此外,宏的使用也会增加代码的复杂性,因为它需要对代码的语法和语义进行更加细致的考虑。
二、函数的优缺点函数是一种可以重复使用的代码块,它可以接受参数并返回结果。
函数的优点在于它可以将代码块封装成一个独立的模块,从而使代码更加清晰和易于维护。
函数也可以使用参数来实现通用性和灵活性,从而可以在不同的场合中使用。
此外,函数还具有良好的作用域和返回值,从而可以避免变量名和函数名的重复定义。
函数的缺点在于它需要进行函数调用,从而增加了程序的开销。
函数调用需要将参数压入栈中,并跳转到函数的入口点,这会导致程序的执行效率降低。
此外,函数也会增加代码的大小,因为每个函数都需要占用一定的内存空间。
三、宏和函数的应用场合宏和函数各有其优缺点和应用场合。
在程序设计中,应该根据实际情况来选择使用宏或函数。
通常情况下,应该优先考虑使用函数。
只有在某些特殊场合下才需要使用宏。
1. 宏的应用场合宏通常用于实现一些简单的代码块,例如常量定义、条件编译等。
宏的优势在于它可以在编译时进行宏替换,从而可以减少代码的大小和复杂性。
此外,宏还可以使用参数来实现代码的通用性和灵活性。
c,c++面试题

1. C++的类和C里面的struct有什么区别?struct成员默认访问权限为public,而class成员默认访问权限为private 2. 析构函数和虚函数的用法和作用析构函数是在对象生存期结束时自动调用的函数,用来释放在构造函数分配的内存。
虚函数是指被关键字virtual说明的函数,作用是使用C++语言的多态特性3. 全局变量和局部变量有什么区别?是怎么实现的?操作系统和编译器是怎么知道的?1) 全局变量的作用用这个程序块,而局部变量作用于当前函数2) 前者在内存中分配在全局数据区,后者分配在栈区3) 生命周期不同:全局变量随主程序创建和创建,随主程序销毁而销毁,局部变量在局部函数内部,甚至局部循环体等内部存在,退出就不存在4) 使用方式不同:通过声明后全局变量程序的各个部分都可以用到,局部变量只能在局部使用4. 有N个大小不等的自然数(1–N),请将它们由小到大排序.要求程序算法:时间复杂度为O(n),空间复杂度为O(1)。
void sort(int e[], int n){int i;int t;for (i=1; i{t = e[e[i]];e[e[i]] = e[i];e[i] = t;}}5. 堆与栈的去区别A. 申请方式不同Stack由系统自动分配,而heap需要程序员自己申请,并指明大小。
B. 申请后系统的响应不同Stack:只要栈的剩余空间大于申请空间,系统就为程序提供内存,否则将抛出栈溢出异常Heap:当系统收到程序申请时,先遍历操作系统中记录空闲内存地址的链表,寻找第一个大于所申请空间的堆结点,然后将该结点从空间结点链表中删除,并将该结点的空间分配给程序。
另外,大多数系统还会在这块内存空间中的首地址处记录本次分配的大小,以便于delete语句正确释放空间。
而且,由于找到的堆结点的大小不一定正好等于申请的大小,系统会自动将多余的那部分重新放入空闲链表。
C. 申请大小限制的不同Stack:在windows下,栈的大小是2M(也可能是1M它是一个编译时就确定的常数),如果申请的空间超过栈的剩余空间时,将提示overflow。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1.函数调用时,先求出实参表达式的值,然后带入形参。
而使用带参的宏只是进行简单的字符替换。
2.函数调用是在程序运行时处理的,分配临时的内存单元;而宏展开则是在编译时进行的,在展开时并不分配内存单元,不进行值的传递处理,也没有“返回值”的概念。
3.对函数中的实参和形参都要定义类型,二者的类型要求一致,如不一致,应进行类型转换;而宏不存在类型问题,宏名无类型,它的参数也无类型,只是一个符号代表,展开时带入指定的字符即可。
宏定义时,字符串可以是任何类型的数据。
4.调用函数只可得到一个返回值,而用宏可以设法得到几个结果。
5.使用宏次数多时,宏展开后源程序长,因为每展开一次都使程序增长,而函数调用不使源程序变长。
6.宏替换不占运行时间,只占编译时间;而函数调用则占运行时间(分配单元、保留现场、值传递、返回)。
一般来说,用宏来代表简短的表达式比较合适。
内联函数和宏很类似,而区别在于,宏是由预处理器对宏进行替代,而内联函数是通过编译器控制来实现的。
而且内联函数是真正的函数,只是在需要用到的时候,内联函数像宏一样的展开,所以取消了函数的参数压栈,减少了调用的开销。
你可以象调用函数一样来调用内联函数,而不必担心会产生于处理宏的一些问题。
当然,内联函数也有一定的局限性。
就是函数中的执行代码不能太多了,如果,内联函数的函数体过大,一般的编译器会放弃内联方式,而采用普通的方式调用函数。
这样,内联函数就和普通函数执行效率一样了。
内联函数是不能为虚函数的,但样子上写成了内联的,即隐含的内联方式。
在某种情况下,虽然有些函数我们声明为了所谓“内联”方式,但有时系统也会把它当作普通的函数来处理,这里的虚函数也一样,虽然同样被声明为了所谓“内联”方式,但系统会把它当然非内联的方式来处理。