毕业生软件工程师面试题
2022年软件工程师面试问题及答案

2022年软件工程师面试问题及答案一、基础知识1.1 编程语言问题:请简述 Java 和 Python 的区别。
答案:Java 是一种面向对象的语言,编译后运行在虚拟机上,性能相对较高,适用于大型企业级应用。
Python 是一种解释型语言,语法简洁明了,开发效率高,适用于快速原型开发和数据分析等场景。
问题:请解释一下什么是面向对象编程?答案:面向对象编程是一种编程范式,它将现实世界中的事物抽象为对象,每个对象具有属性和方法。
面向对象编程的主要特点包括封装、继承和多态。
1.2 数据结构与算法问题:请简述冒泡排序和快速排序的原理。
答案:冒泡排序是通过多次比较和交换相邻元素的位置,将最大的元素逐渐移动到数组的末尾。
快速排序是采用分治法的一个典例,通过选取一个基准元素,将数组分为两部分,分别对这两部分递归地进行快速排序。
问题:请实现一个反转链表的函数。
答案:class ListNode:def __init__(self, value=0, next=None):self.value = valueself.next = nextdef reverse_linked_list(head):prev = Nonecurrent = headwhile current:next_node = current.nextcurrent.next = prevprev = currentcurrent = next_nodereturn prev二、框架与技术2.1 Spring Boot问题:请解释一下 Spring Boot 的自动配置原理。
答案:Spring Boot 通过 `spring.factories` 文件中定义的默认配置信息和用户自定义的配置信息进行自动配置。
它会根据项目所依赖的库和配置信息,自动配置 Spring 容器中的相关组件。
问题:请简述 Spring Boot 中事务管理的原理。
答案:Spring Boot 中的事务管理主要通过代理方式实现。
软件工程师面试题及答案

软件工程师面试题及答案在当今科技飞速发展的时代,软件工程师成为了备受追捧的职业之一。
而在求职过程中,面试是至关重要的环节。
以下为您呈现一些常见的软件工程师面试题及答案,希望能对您有所帮助。
一、技术类问题1、请简要介绍一下面向对象编程(OOP)的三大特性,以及它们在实际开发中的应用。
答案:面向对象编程的三大特性是封装、继承和多态。
封装是将数据和操作数据的方法封装在一个类中,以实现数据的隐藏和保护,提高代码的安全性和可维护性。
例如,将一个人的个人信息和相关操作封装在一个“Person”类中。
继承允许创建一个新类,从现有类继承属性和方法,实现代码的复用和扩展。
比如,从“Employee”类继承创建“Manager”类。
多态使得同一个方法在不同的对象中有不同的实现方式,增强了程序的灵活性。
比如,在一个图形绘制程序中,不同的图形类(如圆形、方形)都实现了“draw”方法,但具体的绘制方式不同。
2、谈谈你对数据库索引的理解,以及在什么情况下应该使用索引,什么情况下不应该使用?答案:数据库索引是一种用于提高数据检索速度的数据结构。
它类似于书籍的目录,通过索引可以快速定位到所需的数据。
在经常用于查询、连接和排序的列上应该使用索引,比如主键、外键、经常用于搜索的字段等。
然而,在数据量小的表、频繁更新的列、数据分布不均匀的列上不应该使用索引,因为创建和维护索引会带来额外的开销,可能会降低数据插入、更新和删除的性能。
3、解释一下什么是线程安全,以及如何实现线程安全?答案:线程安全是指多个线程同时访问和操作同一共享资源时,程序的执行结果是正确的,不会出现数据不一致或其他异常情况。
实现线程安全的方法有多种,比如使用同步关键字(如 synchronized )来锁定关键代码段,确保同一时刻只有一个线程能够访问共享资源;使用线程安全的集合类(如 ConcurrentHashMap )替代非线程安全的集合类;避免共享可变状态,尽量使用不可变对象等。
软件工程经典面试题

软件工程经典面试题1. 什么是软件工程?软件工程(Software Engineering)是应用计算机科学与工程原理、方法和技术,以系统化、规范化、可重复化、可维护性高的方式开发和维护软件产品的学科。
2. 软件开发生命周期有哪些阶段?软件开发生命周期一般包括需求分析、设计、编码、测试和维护五个阶段。
需求分析阶段:对需求进行详细的分析、整理和记录,包括功能需求和非功能需求等。
设计阶段:根据需求分析的结果,确定软件的架构和设计方案,设计模块和函数等。
编码阶段:按照设计阶段确定的方案,进行编码开发,实现软件功能。
测试阶段:对软件进行系统测试、集成测试、单元测试等,检测和发现软件存在的问题。
维护阶段:修复软件中出现的问题,对软件进行更新和维护。
3. 什么是软件设计模式?软件设计模式是对软件设计中常见问题的解决方案的描述,是开发人员在使用特定的模式应对软件设计时遇到的问题的经验总结。
常见的软件设计模式有单例模式、工厂模式、观察者模式等,它们能够简化开发,提高代码的可读性、复用性和可维护性。
4. 什么是敏捷开发?敏捷开发(Agile Development)是一种基于迭代和自我组织的软件开发过程方法。
它重视团队合作、用户需求和反馈,并通过迭代、交付和反思的方式实现快速产品开发和可持续交付的目标。
敏捷开发注重不断优化过程,并在不断的用户反馈中进行快速迭代和交付,以满足用户需求,提高软件质量和用户体验。
5. 什么是持续集成?持续集成(Continuous Integration,CI)是一种将代码频繁地、自动地集成到共享代码仓库,并进行自动化构建、测试和分发的软件开发方法。
通过持续集成能够减少软件开发周期、提高代码质量和可维护性。
在持续集成中,开发人员频繁地将自己的代码集成到共享开发分支中,任何时候都可以进行代码构建、测试、分发等,从而在短时间内发现和定位软件问题,提高软件质量。
应届生软件工程师面试题目

应届生软件工程师面试题目
一、专业知识类
1. 你对软件工程的理解是什么?
2. 你掌握哪些编程语言?并简要介绍一下。
3. 你对数据结构和算法的理解是什么?举例说明。
4. 你了解软件设计模式吗?可以简要介绍一下常用的设计模式吗?
5. 你掌握哪些开发工具和技术?例如 IDE、版本控制工具、自动化测试工具等。
6. 你了解网络编程方面的知识吗?例如 TCP/IP、HTTP、WebSocket 等协议,Socket 编程等。
二、项目经验类
1. 你的最佳项目是哪一个,可以介绍一下吗?
2. 你在该项目中的贡献是什么?你遇到了什么困难,是如何解决的?
3. 你如何衡量项目的成功与否?有哪些关键指标或因素?
4. 你用哪些工具和方法来管理和协调项目进度和任务分配?
5. 你在项目中遇到过哪些问题?你是如何避免和解决这些问题的?
三、个人技能类
1. 你有哪些编程方面的自我提升经验和方法?如何提高自己的
代码质量和效率?
2. 你如何进行调试和排错?举例说明你针对某个难以定位的错
误是如何进行分析和解决的。
3. 你是如何进行团队合作的?有哪些团队合作的经验?
4. 你有哪些自我管理方面的技能和方法?如何合理分配自己的
时间,提高工作效率?
5. 你的沟通能力如何?如果遇到困难或者需要向团队反馈信息,你通常是如何进行的?。
软件工程师面试题及答案

软件工程师面试题及答案选择题1:设float a=2, b=4, c=3;,以下C语言表达式与代数式(a+b)+c计算结果不一致的是A.(a+b)*c/2B.(1/2)*(a+b)*cC.(a+b)*c*1/2D.c/2*(a+b)参考答案:B,因为a,b,c三个变量都是浮点数,所以在B答案中其结果是0,因为在计算1/2是就是0,如果改成1/2.0就正确了。
2:为了向二进制文件尾部增加数据,打开文件的方式应采用A.″ab″B.″rb+″C.″wb″D.″wb+″参考答案:Ar:打开一个文本文件只读w:打开一个文本文件只写a:对一个文本文件添加rb:打开一个二进制文件只读wb:打开一个二进制文件只写ab:对一个二进制文件添加r+:打开一个文本文件读/写w+:生成一个文本文件读/写a+:打开一个文本文件读/写rb+:打开二进制文件读/写wb+:生成二进制文件读/写ab+:打开二进制文件读/写3:下述程序执行后的输出结果是#includemain(){int x='f';printf("%c\n",'a'+(x-'a'+1));}A.gB.hC.iD.j参考答案:A4:C语言中,下列运算符优先级最高的是A.! B.% C.>> D.==参考答案:A5:数组定义为“ int a [ 4 ] ; ”,表达式 ( ) 是错误的。
A.*aB.a [ 0 ]C.aD.a++参考答案:D6:执行语句“ k=7>>1; ”后,变量 k 的当前值是A.15 B.31 C.3 D.17:定义函数时,缺省函数的类型声明,则函数类型取缺省类型A.void B.char C.float D.int参考答案:D8:若main()函数带参数,参数个数最多是A.0B.1C.2D.3参考答案:C 只知道有定义形式main(int argc,char* argv[]))9:若有宏定义:#define MOD(x,y) x%y则执行以下语句后的输出结果是int a=13,b=94;printf(″%d\n″,MOD(b,a+4));A.5B.7C.9D.11参考答案:B10:下列各个错误中,哪一个不属于编译错误A.改变 x 原值 3 为 5 ,写作“ x==5 ;”B.花括号不配对C.复合语句中的最后一条语句后未加分号D.变量有引用、无定义参考答案:A11:下列程序段运行后, x 的值是( )a=1;b=2;x=0;if(!( -- a))x -- ;if(!b)x=7;else ++x;A.0B.3C.6D.712:设#define N 3#define Y(n) ((N+1)*n)则表达式2*(N+Y(5+1))的值是A.42B.48C.54D.出错参考答案:B Y(5+1) 传递过去的应该是5+1,而不是简单的把6给替换掉13:若定义了char ch[]={″abc\0def″},*p=ch;则执行printf(″%c″,*p+4);语句的输出结果是A.defB.dC.eD.0参考答案:C14:表达式 !x 等效于A.x==1B.x==0C.x!=1D.x!=0参考答案:B15:算术运算符,赋值运算符和关系运算符的运算优先级按从高到低依次为A.算术运算、赋值运算、关系运算B.算术运算、关系运算、赋值运算C.关系运算、赋值运算、算术运算D.关系运算、算术运算、赋值运算参考答案:B16:设#define N 3#define Y(n) ((N+1)*n)则表达式2*(N+Y(5+1))的值是A.42B.48C.54D.出错参考答案:B17:表达式 strcmp( “ 3.14 ”,“ 3.278 ” ) 的值是一个A.非零整数 B.浮点数 C.0 D.字符参考答案: A18:设struct{ short a;char b;float c;}cs;则sizeof(cs)的值是A.4B.5C.6D.7参考答案: D 字节对齐的话应该是819:若变量已正确定义,表达式( j=3 , j++ )的值是A.3B.4C.5D.0参考答案:A20:C 语言中运算对象必须是整型的运算符是A.%B./C.!D.**参考答案:A答问题1. static有什么用途?(请至少说明两种)1.限制变量的作用域2.设置变量的存储域2. 引用与指针有什么区别?1) 引用必须被初始化,指针不必。
软件工程师岗位面试题及答案(经典版)

软件工程师岗位面试题及答案1.请介绍一次您在团队中解决复杂技术问题的经历。
答案:在上一家公司,我们遇到了一个性能瓶颈问题,导致应用程序响应变慢。
通过分析代码,我发现了数据库查询优化的机会。
我重新设计了查询,减少了查询时间,从而提升了应用程序的性能。
2.请谈谈您在版本控制系统中的经验,以及您如何处理合并冲突。
答案:我熟悉Git,并且经常使用分支进行开发。
当出现合并冲突时,我会首先理解冲突的本质,然后与团队成员讨论解决方案。
我们会在测试环境中验证修改,确保没有引入新问题。
3.在敏捷开发中,您如何确保团队按时交付功能?答案:我在敏捷开发团队中担任过ScrumMaster角色。
我会协助制定冲刺目标,跟踪任务的进度,及时解决障碍,并确保团队保持高效沟通,以确保按时交付。
4.您如何保证代码质量和可维护性?答案:我重视代码审查和单元测试。
代码审查可以发现潜在问题并提供改进建议,而单元测试可以确保代码的正确性。
我还注重编写清晰的文档,以便将来维护和扩展代码。
5.请描述一个您在项目中使用设计模式解决问题的实例。
答案:在一个电子商务项目中,我们需要实现不同支付方式的接口,以支持多种支付方式。
我采用了策略模式,将每种支付方式封装为一个独立的类,并在运行时动态选择合适的支付策略。
6.如何处理一个需求变更,该变更可能对项目进度产生影响?答案:首先,我会与产品经理和团队讨论变更的紧急性和影响。
如果变更必要且合理,我们将评估其对进度的影响,并相应地进行调整,可能会重新分配资源或者调整冲刺计划。
7.您在持续集成和持续交付方面有何经验?答案:我在多个项目中使用Jenkins进行持续集成和交付。
我设置了自动化构建和测试流程,并确保每次提交都会触发构建和测试,从而及早发现问题并快速修复。
8.请说明您在保障应用程序安全性方面的做法。
答案:我会定期进行安全漏洞扫描和代码审查,确保代码没有潜在的安全隐患。
我还会采用输入验证、身份认证和授权等措施来保护应用程序免受攻击。
软件工程师面试问题

软件工程师面试问题一、基本面试问题:1. 简单介绍一下你自己。
2. 你对软件工程师这个职位有什么理解?你觉得自己适合这个职位吗?3. 能否谈谈你对软件开发生命周期的了解?4. 你在过去的项目中遇到的最大的挑战是什么?你是如何处理的?5. 你如何处理项目延期或失败的情况?6. 在你的上一份工作中,你是如何与团队合作的?有遇到过与团队成员发生冲突的情况吗?你是如何处理的?7. 你有使用过哪些软件开发工具和技术?8. 能否谈谈你对代码质量的看法以及如何保证代码的质量?9. 你有使用过哪些软件开发模型?你认为哪个模型是最适合软件开发的?10. 你有没有参与到开源项目或者个人的项目中?能谈谈你的经验吗?11. 能否谈谈你对团队沟通和合作的看法?12. 你在哪些方面希望继续学习和提升自己?13. 你最擅长的编程语言是什么?为什么选择这个编程语言?14. 你对数据结构和算法有什么了解?能举例说明在实际项目中的应用吗?15. 你是否持续关注行业的发展和新技术的变化?二、技术面试问题:1. 什么是面向对象编程(OOP)?能否举例说明面向对象编程和面向过程编程的区别?2. 什么是设计模式?能否谈谈你熟悉的设计模式以及它们的应用场景?3. 什么是数据库索引?为什么要使用索引?你是如何优化数据库查询性能的?4. 你在开发过程中如何保证代码的可维护性和可扩展性?5. 什么是HTTP协议?它的工作原理是什么?6. 你对前端开发有了解吗?能谈谈前端开发中常用的技术和工具吗?7. 你对云计算和大数据有了解吗?能谈谈它们对软件开发的影响吗?8. 你有使用过自动化测试工具吗?能谈谈你使用的自动化测试工具以及它们的优缺点?9. 什么是敏捷开发?你认为敏捷开发在软件开发过程中的哪些方面有帮助?10. 你有使用过版本控制工具吗?如果是,请介绍一下你使用的版本控制工具,比如Git。
11. 你在开发过程中遇到过性能问题吗?你是如何进行性能优化的?12. 什么是多线程和并发?你是如何处理多线程编程中的安全问题的?13. 你有使用过数据库管理工具吗?如果是,请介绍一下你使用的数据库管理工具,比如MySQL。
软件工程师常见面试题

软件工程师常见面试题在当今竞争激烈的就业市场中,软件工程师的岗位备受青睐。
而面试则是通往这一岗位的关键环节,面试官通常会通过一系列问题来评估候选人的技术能力、解决问题的能力、团队协作能力以及沟通能力等。
以下是一些常见的软件工程师面试题:一、技术基础类1、谈谈你对面向对象编程(OOP)的理解,以及其三大特性(封装、继承、多态)在实际开发中的应用。
面向对象编程是一种编程范式,它将数据和操作数据的方法封装在一起,形成对象。
封装可以隐藏对象的内部实现细节,只暴露必要的接口,提高了代码的安全性和可维护性。
继承允许子类继承父类的属性和方法,实现代码的复用和扩展。
多态则使得同一个方法在不同的对象上有不同的实现方式,增强了程序的灵活性和可扩展性。
比如,在一个图形绘制的程序中,可以定义一个父类“Shape”,然后派生出子类“Circle”、“Rectangle”等,通过多态,可以用统一的接口来绘制不同的图形。
2、解释一下什么是数据库索引,以及它的作用和可能带来的弊端。
数据库索引是一种数据库结构,用于加快数据的查询和检索速度。
它就像一本书的目录,通过索引可以快速定位到所需的数据,而不必全表扫描。
索引的作用显著,能够大大提高查询效率,特别是在处理大型数据表时。
然而,索引也并非完美无缺。
创建和维护索引需要消耗系统资源,过多的索引会增加数据插入、更新和删除的开销。
此外,对于很少用于查询或者数据量较小的表,创建索引可能得不偿失。
3、请简述一下常见的排序算法(如冒泡排序、快速排序、归并排序等)的时间复杂度和空间复杂度,并比较它们的优缺点。
冒泡排序的时间复杂度为 O(n²),空间复杂度为 O(1)。
它的优点是实现简单,易于理解,缺点是效率较低。
快速排序的平均时间复杂度为 O(nlogn),最坏情况为 O(n²),空间复杂度为 O(logn)到 O(n)。
它在大多数情况下效率很高,但在最坏情况下性能不佳。
归并排序的时间复杂度为 O(nlogn),空间复杂度为 O(n)。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2 网络知识2.1 OSI和TCP/IP1. 的七层网络结构图(功能及特点)OSI1) 物理层:为数据链路层提供物理连接,在其上串行传送比特流,即所传送数据的单位是比特。
此外,该层中还具有确定连接设备的电气特性和物理特性等功能。
2) 数据链路层:负责在网络节点间的线路上通过检测、流量控制和重发等手段,无差错地传送以帧为单位的数据。
为做到这一点,在每一帧中必须同时带有同步、地址、差错控制及流量控制等控制信息。
3) 网络层:为了将数据分组从源(源端系统)送到目的地(目标端系统),网络层的任务就是选择合适的路由和交换节点,使源的传输层传下来的分组信息能够正确无误地按照地址找到目的地,并交付给相应的传输层,即完成网络的寻址功能。
4) 传输层:传输层是高低层之间衔接的接口层。
数据传输的单位是报文,当报文较长时将它分割成若干分组,然后交给网络层进行传输。
传输层是计算机网络协议分层中的最关键一层,该层以上各层将不再管理信息传输问题。
5) 会话层:该层对传输的报文提供同步管理服务。
在两个不同系统的互相通信的应用进程之间建立、组织和协调交互。
例如,确定是双工还是半双工工作。
6) 表示层:该层的主要任务是把所传送的数据的抽象语法变换为传送语法,即把不同计算机内部的不同表示形式转换成网络通信中的标准表示形式。
此外,对传送的数据加密(或解密)、正文压缩(或还原)也是表示层的任务。
7) 应用层:该层直接面向用户,是OSI中的最高层。
它的主要任务是为用户提供应用的接口,即提供不同计算机间的文件传送、访问与管理,电子邮件的内容处理,不同计算机通过网络交互访问的虚拟终端功能等。
2. (功能及特点)TCP/IP1) 网络接口层:这是TCP/IP协议的最低一层,包括有多种逻辑链路控制和媒体访问协议。
网络接口层的功能是接收IP数据报并通过特定的网络进行传输,或从网络上接收物理帧,抽取出IP数据报并转交给网际层。
2) 网际网层(IP层):该层包括以下协议:IP(网际协议)、ICMP(Internet Control Message Protocol,因特网控制报文协议)、ARP(Address Resolution Protocol,地址解析协议)、RARP(Reverse Address Resolution Protocol,反向地址解析协议)。
该层负责相同或不同网络中计算机之间的通信,主要处理数据报和路由。
在IP层中,ARP协议用于将IP地址转换成物理地址,RARP协议用于将物理地址转换成IP地址,ICMP协议用于报告差错和传送控制信息。
IP协议在TCP/IP协议组中处于核心地位。
3) 传输层:该层提供TCP(传输控制协议)和UDP(User Datagram Protocol,用户数据报协议)两个协议,它们都建立在IP协议的基础上,其中TCP提供可靠的面向连接服务,UDP提供简单的无连接服务。
传输层提供端到端,即应用程序之间的通信,主要功能是数据格式化、数据确认和丢失重传等。
4) 应用层:TCP/IP协议的应用层相当于OSI模型的会话层、表示层和应用层,它向用户提供一组常用的应用层协议,其中包括:Telnet、SMTP、DNS等。
此外,在应用层中还包含有用户应用程序,它们均是建立在TCP/IP协议组之上的专用程序。
3. 参考模型和TCP/IP参考模型的区别:OSI1) OSI模型有7层,TCP/IP只有4层;2) OSI先于协议出现,因此不会偏向于任何一组特定的协议,通用性更强,但有些功能不知该放哪一层上,因此不得不加入一些子层;TCP/IP后于协议出现,仅是将已有协议的一个描述,因此两者配合的非常好;但他不适合其他的协议栈,不容易描述其他非TCP/IP 的网络;3) OSI中网络层同时支持无连接和面向连接的通信,但在传输层上只支持面向连接的通信;TCP/IP中网络层只支持无连接通信,传输层同时支持两种通信;4) 在技术发生变化时,OSI模型比TCP/IP模型中的协议更容易被替换。
4. 请你详细的解释一下IP协议的定义,在哪个层上面,主要有什么作用?TCP 与UDP呢?解:与IP协议配套使用的还有三个协议:ARP-地址解析协议RARP-逆地址解析协议ICMP-因特网控制报文协议ICMPIP协议-网际协议IP地址、IP包头2.2 交换机和路由器1. 请问交换机和路由器分别的实现原理是什么?分别在哪个层次上面实现的?将网络互相连接起来要使用一些中间设备(或中间系统),ISO的术语称之为中继(relay)系统。
根据中继系统所在的层次,可以有以下五种中继系统:1) 物理层(即常说的第一层、层L1)中继系统,即转发器(repeater)。
2) 数据链路层(即第二层,层L2),即网桥或桥接器(bridge)。
3) 网络层(第三层,层L3)中继系统,即路由器(router)。
4) 网桥和路由器的混合物桥路器(brouter)兼有网桥和路由器的功能。
5) 在网络层以上的中继系统,即网关(gateway).当中继系统是转发器时,一般不称之为网络互联,因为这仅仅是把一个网络扩大了,而这仍然是一个网络。
高层网关由于比较复杂,目前使用得较少。
因此一般讨论网络互连时都是指用交换机和路由器进行互联的网络。
本文主要阐述交换机和路由器及其区别。
2. 第二层交换机和路由器的区别:传统交换机从网桥发展而来,属于OSI第二层即数据链路层设备。
它根据MAC地址寻址,通过站表选择路由,站表的建立和维护由交换机自动进行。
路由器属于OSI第三层即网络层设备,它根据IP地址进行寻址,通过路由表路由协议产生。
因特网的路由选择协议:内部网关协议IGP和外部网关协议EGP3. 第三层交换机和路由器的区别:在第三层交换技术出现之前,几乎没有必要将路由功能器件和路由器区别开来,他们完全是相同的:提供路由功能正在路由器的工作,然而,现在第三层交换机完全能够执行传统路由器的大多数功能。
综上所述,交换机一般用于LAN-WAN的连接,交换机归于网桥,是数据链路层的设备,有些交换机也可实现第三层的交换。
路由器用于WAN-WAN之间的连接,可以解决异性网络之间转发分组,作用于网络层。
他们只是从一条线路上接受输入分组,然后向另一条线路转发。
这两条线路可能分属于不同的网络,并采用不同协议。
相比较而言,路由器的功能较交换机要强大,但速度相对也慢,价格昂贵,第三层交换机既有交换机线速转发报文能力,又有路由器良好的控制功能,因此得以广播应用。
3 高质量编程C/C++一、请填写BOOL , float, 指针变量与“零值”比较的if 语句。
(10 分)请写出BOOL flag 与“零值”比较的if 语句。
(3 分)标准答案:if ( flag )if ( !flag )如下写法均属不良风格,不得分。
if (flag == TRUE)if (flag == 1 )if (flag == FALSE)if (flag == 0)请写出float x 与“零值”比较的if 语句。
(4 分)标准答案示例:const float EPSINON = 0.000001;if ((x >= - EPSINON) && (x =”或“请写出char *p 与“零值”比较的if 语句。
(3 分)标准答案:if (p == NULL)if (p != NULL)如下写法均属不良风格,不得分。
if (p == 0)if (p != 0)if (p)if (!)二、以下为Windows NT 下的32 位C++程序,请计算sizeof 的值(10 分)void Func ( char str[100]){请计算sizeof( str ) = 4 (2 分)}char str[] = “Hello” ;char *p = str ;int n = 10;请计算sizeof (str ) = 6 (2 分)sizeof ( p ) = 4 (2 分)sizeof ( n ) = 4 (2 分)void *p = malloc( 100 );请计算sizeof ( p ) = 4 (2 分)三、简答题(25 分)1、头文件中的ifndef/define/endif 干什么用?(5 分)答:防止该头文件被重复引用。
2、#include 和#include “filename.h” 有什么区别?(5 分)答:对于#include ,编译器从标准库路径开始搜索filename.h对于#include “filename.h” ,编译器从用户的工作路径开始搜索filename.h 3、const 有什么用途?(请至少说明两种)(5 分)答:(1)可以定义const 常量,(2)const 可以修饰函数的参数、返回值,甚至函数的定义体。
被const 修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。
4、在C++ 程序中调用被C 编译器编译后的函数,为什么要加extern “C”?(5 分)答:C++语言支持函数重载,C 语言不支持函数重载。
函数被C++编译后在库中的名字与C 语言的不同。
假设某个函数的原型为:void foo(int x, int y);该函数被C 编译器编译后在库中的名字为_foo ,而C++编译器则会产生像_foo_int_int 之类的名字。
C++提供了C 连接交换指定符号extern“C”来解决名字匹配问题。
5、请简述以下两个for 循环的优缺点(5 分)for (i=0; ivoid Test(void){char *str = (char *) malloc(100);strcpy(str, “hello”);free(str);if(str != NULL){strcpy(str, “world”);printf(str);}}请问运行Test 函数会有什么样的结果?答:篡改动态内存区的内容,后果难以预料,非常危险。
因为free(str);之后,str 成为野指针,if(str != NULL)语句不起作用。
五、编写strcpy 函数(10 分)已知strcpy 函数的原型是char *strcpy(char *strDest, const char *strSrc);其中strDest 是目的字符串,strSrc 是源字符串。
(1)不调用C++/C 的字符串库函数,请编写函数strcpychar *strcpy(char *strDest, const char *strSrc);{assert((strDest!=NULL) && (strSrc !=NULL)); // 2分char *address = strDest; // 2分while( (*strDest++ = * s trSrc++) != ‘\0’ ) // 2分NULL ;return address ; // 2分}(2)strcpy 能把strSrc 的内容复制到strDest,为什么还要char * 类型的返回值?答:为了实现链式表达式。