C语言软件工程师笔试题精华
C语言软件工程师笔试题大全

C语言软件工程师笔试题大全1. 基础知识题1.1 变量和数据类型1.请描述int和float这两种数据类型分别在内存中所占的字节数以及其取值范围。
2.什么是变量,变量的命名规则有哪些限制?3.请简要介绍C语言中的整型常量、浮点型常量和字符常量。
1.2 运算符和表达式1.C语言中的逻辑运算符有哪些?它们的运算规则是什么?2.请解释C语言中的前缀递增和后缀递增运算符的区别。
3.下面的表达式的结果是多少?int x = 5; int y = x++;1.3 控制结构1.请解释C语言中的if-else语句的用法和语法。
2.请解释C语言中的for循环语句的用法和语法。
3.请解释C语言中的switch语句的用法和语法。
2. 中级知识题2.1 数组和字符串1.请解释C语言中的一维数组和多维数组的定义和使用方法。
2.请编写一个程序,实现对一个整型数组的冒泡排序。
3.请编写一个程序,实现两个字符串的拼接。
2.2 指针和内存管理1.请解释C语言中的指针的概念和作用,并说明指针的运算规则。
2.请编写一个程序,交换两个变量的值,使用指针作为函数的参数。
3.请解释C语言中的动态内存分配和释放的方法,并编写一个例子。
2.3 结构体和联合体1.请解释C语言中的结构体的概念和用法,并编写一个例子。
2.请解释C语言中的联合体的概念和用法,并编写一个例子。
3.请解释C语言中的位字段的概念和用法,并编写一个例子。
3. 高级知识题3.1 函数和库1.请解释C语言中的函数指针的概念和用法,并编写一个例子。
2.请解释C语言中的标准库和自定义库的区别,并说明如何使用自定义库。
3.请解释C语言中的递归函数的概念和用法,并编写一个例子。
3.2 文件操作1.请解释C语言中的文件指针的概念和用法,并说明如何打开、读取和关闭文件。
2.请编写一个程序,实现对一个文本文件的读取和统计某个字符出现的次数。
3.请编写一个程序,实现对一个文本文件的写入操作,将一个字符串写入文件。
c语言考试笔试题及答案详解

c语言考试笔试题及答案详解一、选择题(每题2分,共20分)1. C语言中用于定义一个结构体的关键字是:A. structB. unionC. enumD. typedef答案:A2. 下列关于C语言中数组的描述,错误的是:A. 数组必须在编译时确定大小B. 数组可以是多维的C. 数组的元素必须是同一类型D. 数组可以动态分配答案:D3. 在C语言中,哪个函数用于将字符串复制到另一个字符串?A. strcpyB. strcatC. strncpyD. strcmp答案:A4. 下列哪个选项不是C语言中的运算符?A. %B. &&C. ::D. ||答案:C5. C语言中,用于定义一个函数的关键字是:A. functionB. defC. voidD. int答案:C6. 下列哪个选项不是C语言中的控制语句?A. ifB. switchC. caseD. for答案:C7. 在C语言中,用于声明一个指针的语法是:A. int *p;B. int p*;C. int *p = 0;D. int *p = p;答案:A8. C语言中,用于定义一个枚举类型的关键字是:A. enumB. typedefC. unionD. struct答案:A9. 下列关于C语言中指针的描述,错误的是:A. 指针可以指向任何类型的数据B. 指针可以作为函数的参数C. 指针可以作为函数的返回值D. 指针可以存储函数的地址答案:D10. C语言中,用于定义一个联合体的关键字是:A. structB. unionC. enumD. typedef答案:B二、填空题(每题3分,共15分)1. 在C语言中,使用________关键字可以定义一个变量的存储类型为静态存储。
答案:static2. C语言中,使用________运算符可以计算两个整数的和。
答案:+3. 在C语言中,使用________关键字可以定义一个函数的返回类型为无返回值。
c软件开发笔试题目

c软件开发笔试题目C语言是一种底层的编程语言,广泛应用于软件开发和系统编程中。
C语言的掌握程度对于软件工程师而言是非常重要的。
为了评估应聘者对C语言的理解和编程能力,以下是一些C 语言的笔试题目。
1. 编写一个程序,计算斐波那契数列的第n项。
示例:输入: n = 6输出: 82. 编写一个程序,将字符串中的每个单词的首字母变为大写。
示例:输入: "hello world"输出: "Hello World"3. 编写一个程序,输入一个字符串并判断是否为回文字符串。
示例:输入: "racecar"输出: 是回文字符串4. 编写一个程序,输入一个整数并判断是否为素数。
示例:输出: 是素数5. 编写一个程序,输入一个字符串并统计其中每个字符出现的次数。
示例:输入: "hello"输出:h: 1e: 1l: 2o: 16. 编写一个程序,输入两个整数并计算它们的最大公约数。
示例:输入: 36, 48输出: 127. 编写一个程序,输入一个数组并逆序输出。
示例:输入: [1, 2, 3, 4, 5]输出: [5, 4, 3, 2, 1]8. 编写一个程序,实现冒泡排序算法。
输入: [5, 2, 1, 3, 4]输出: [1, 2, 3, 4, 5]9. 编写一个程序,实现选择排序算法。
示例:输入: [5, 2, 1, 3, 4]输出: [1, 2, 3, 4, 5]10. 编写一个程序,实现快速排序算法。
示例:输入: [5, 2, 1, 3, 4]输出: [1, 2, 3, 4, 5]以上是一些基础的C语言编程题目。
应聘者可以根据自己的理解和实际的编程能力,完成相应的代码实现。
除了正确的输出结果,代码的可读性、效率和健壮性也是评价标准。
在面试过程中,可以考察应聘者对于C语言的理解和应用能力,从而评估其在软件开发中的潜力和能力。
11. 编写一个程序,实现链表的基本操作,包括创建链表、插入节点、删除节点以及打印链表。
软件岗位笔试题1(C语言)

软件岗位笔试题1(C语言)一、单选题(每题2分,共40分)1、一个算法应该具有“确定性”等五个特性,下面对另外4个特性的描述中错误的是() [单选题] *A、有零个或多个输入B、有零个或多个输出(正确答案)C、有穷性D、可行性2、C语言中最简单的数据类型包括() [单选题] *A、整型、实型、逻辑型B、整型、实型、字符型(正确答案)C、整型、字符型、逻辑型D、整型、实型、逻辑型、字符型3、设a和b均为double型变量,且a=5.5、b=2.5,则表达式(int)a+b/b的值是()[单选题] *A、 6.500000B、 6C、 5.500000D、 6.000000(正确答案)4、x、y、z被定义为int型变量,若从键盘给x、y、z输入数据,正确的输入语句是() [单选题] *A、 INPUT x、y、z;B、 scanf("%d%d%d",&x,&y,&z);(正确答案)C、 scanf("%d%d%d",x,y,z);D、 read("%d%d%d",&x,&y,&z);5、设 int x=1, y=1; 表达式(!x||y--)的值是()。
[单选题] *A、0B、1(正确答案)C、2D、-16、对两个字符数组a和b进行初始化char a[]="ABCDEF";charb[ ]={'A','B','C','D','E','F'}; 则()。
[单选题] *A、a与b数组完全相同B、a与b长度相同C、a和b中都存放字符串D、a数组比b数组长度长(正确答案)7、为了避免在嵌套的条件语句if――else中产生二义性,c语言规定:else子句总是与() [单选题] *A、缩排位置相同的ifB、其之前最近的if(正确答案)C、其之后最近的ifD、同一行上的if8、下面不正确的字符串常量是() [单选题] *A、 'abc'(正确答案)B、 "12'12"C、 "0"D、 " "9、以下错误的if语句是()。
C笔试题目及答案c语言笔试题目及答案

C笔试题目及答案c语言笔试题目及答案c笔试题目及答案:c语言笔试题目及答案c笔试题目汇总篇11.谋下面函数的返回值(谷歌)intfunc(x){intcountx=0;while(x){countx++;x=x&(x-1);}returncountx;}假定x=。
答案:8思路:将x转变为2十进制,看看所含的1的个数。
2.什么是“引用”?申明和使用“引用”要注意哪些问题?请问:提及就是某个目标变量的“别称”(alias),对应用领域的操作方式与对变量轻易操作方式效果完全相同。
言明一个提及的时候,切勿必须对其展开初始化。
提及声明完后,相等于目标局部变量存有两个名称,即为该目标原名称和提及名,无法再把该提及名做为其他局部变量的别称。
声明一个提及,不是崭新定义了一个变量,它只则表示该提及名就是目标局部变量的一个别称,它本身不是一种数据类型,因此提及本身不占到存储单元,系统也不给提及分配存储单元。
无法创建数组的提及。
3.将“引用”作为函数参数有哪些特点?(1)传达提及给函数与传达指针的效果就是一样的。
这时,被调函数的形参就沦为原来主调函数中的实参变量或对象的一个别称去采用,所以在被调函数中对形参变量的操作方式就是对其适当的目标对象(在主调函数中)的操作方式。
(2)使用引用传递函数的参数,在内存中并没有产生实参的副本,它是直接对实参操作;而使用一般变量传递函数的参数,当发生函数调用时,需要给形参分配存储单元,形参变量是实参变量的副本;如果传递的是对象,还将调用拷贝构造函数。
因此,当参数传递的数据较大时,用引用比用一般变量传递参数的效率和所占空间都好。
(3)采用指针做为函数的参数虽然也能够达至与采用提及的效果,但是,在被调函数中同样必须给形参分配存储单元,且须要重复使用"*指针局部变量"的形式展开运算,这很难产生错误且程序的写作性极差;另一方面,在主调函数的调用点处,必须用变量的地址做为实参。
100条经典C语言笔试题目(全)

100条经典C语言笔试题目1、请填写bool , float, 指针变量与“零值”比较的if 语句。
提示:这里“零值”可以是0, 0.0 , FALSE 或者“空指针”。
例如int 变量n 与“零值”比较的if 语句为:if ( n == 0 )if ( n != 0 )以此类推。
(1)请写出bool flag 与“零值”比较的if 语句:【标准答案】if ( flag ) if ( !flag )(2)请写出float x 与“零值”比较的if 语句:【标准答案】const float EPSINON = 0.00001; if ((x >= - EPSINON) && (x <= EPSINON) 不可将浮点变量用“==”或“!=”与数字比较,应该设法转化成“>=”或“<=”此类形式。
(3)请写出char *p 与“零值”比较的if 语句【标准答案】if (p == NULL) if (p != NULL)2、以下为Linux下的32 位C程序,请计算sizeof 的值。
char str[] = “Hello” ; char *p = str ; int n = 10;请计算(1)sizeof (str ) = (2)sizeof ( p ) = (3)sizeof ( n ) =【标准答案】(1)6、(2)4、(3)4(4)void Func ( char str[100]) { ……;}请计算sizeof( str ) =(5)void *p = malloc( 100 ); 请计算sizeof ( p ) =【标准答案】(4)4、(5)43、long a=0x801010;a+5=?【标准答案】0x801010用二进制表示为:“1000 0000 0001 0000 0001 0000”,十进制的值为8392720,再加上5就是8392725。
4、用变量a给出下面的定义e) 一个有10个指针的数组,该指针是指向一个整型数的;f) 一个指向有10个整型数数组的指针;g) 一个指向函数的指针,该函数有一个整型参数并返回一个整型数;h) 一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数;【标准答案】e)int * a[10]; f)int (*a)[10]g)int (*a)(int); h) int (*a[10])(int)5、设有以下说明和定义:typedef union {long i; int k[5]; char c;} DATE;struct data { int cat; DATE cow; double dog;} too;DATE max;则语句printf("%d",sizeof(struct date)+sizeof(max));的执行结果是:_____【标准答案】DATE是一个union, 变量公用空间. 里面最大的变量类型是int[5], 占用20个字节. 所以它的大小是20data是一个struct, 每个变量分开占用空间. 依次为int4 + DATE20 + double8 = 32.所以结果是20 + 32 = 52.当然...在某些16位编辑器下, int可能是2字节,那么结果是int2 + DATE10 + double8 = 20 6、请问以下代码有什么问题:int main(){char a;char *str=&a;strcpy(str,"hello");printf(str);return 0;}【标准答案】没有为str分配内存空间,将会发生异常问题出在将一个字符串复制进一个字符变量指针所指地址。
C#软件工程师笔试题_笔试题目

C#软件工程师笔试题C#是一种安全的、稳定的、简单的、优雅的,由C和C++衍生出来的面向对象的编程语言。
它在继承C和C++强大功能的同时去掉了一些它们的复杂特性(例如没有宏以及不允许多重继承)。
下面就由小编为大家介绍一下C#软件工程师笔试题的文章,欢迎阅读。
C#软件工程师笔试题篇11. 使用白盒测试方法时,确定测试数据应根据( )和指定的覆盖标准A. 程序的内部逻辑B. 程序的复杂结构C. 使用说明书D. 程序的功能2.在XML中,DTD文件如下配置其中的*号,表示的意思是( )A. EMAIL出现一次 ?B. EMAIL不出现C. EMAIL不出现或出现多次D. EMAIL不出现或出现一次3.在一个DTD声明中定义了一个元素为那么如下的XML文档片段中合法的是( )A. <联系人><姓名>saB. <联系人><姓名>saC. <联系人><姓名><姓>sa<名>saD. <联系人><姓名value = “sa”>4.在C#中,以下哪些变量的命名是错误的( )A. int i ?B. int No.1 ?C. int Int ?D. int @int5. 在.NET中,以下关于命名空间描述正确的是( )A. 命名空间不可以进行嵌套B. 在一个.CS文件中,只能存在一个命名空间C. 使用private修饰的命名空间,其内部的类也不许访问D. 命名空间可以使用别名,例如using C1=N16.关于C#中继承的概念,下列说法错误的是( )A. 构造函数和析构函数都不能被继承B. 除了构造析构函数,其他成员无论访问方式,都能被继承C. 派生类如果定义了与继承下来成员同名的新成员,可以覆盖已继承的成员D. 派生类不能重载基类的虚属性、虚方法7. 阅读以下C#代码,将在控制台窗口输出( )using System;public class Test{static void F{try{ G;}catch(Exception e){Console.WriteLine(“Exception in F:” + e.Message);e = new Ex ception(“F”);throw;}}static void G{ throw new Exception(“G”);}static void Main(string args){try{ F;}catch(Exception e){Console.WriteLine(“Exception in Main:” + e.Message);}}}A. Exception in F:GB. Exception in F:GException in Main:G Exception in Main:FC. Exception in F:FD. Exception in F:FException in Main:G Exception in Main:F8.阅读以下C#代码,将在控制台窗口输出( )class A{ public A{ Console.WriteLine(“A”);}}class B : A{ public B{ Console.WriteLine(“B”);}}class App{ static void Main(string args){ B b = new B;}}A. A ?B. B ?C. ABD. BA9. 关于以下C#代码,下列说法正确的是( )static void Main(string args){Console.WriteLine(“运行结果:{0}”,Console.ReadLine);}A. 在控制台窗口显示”运行结果:”B. 在控制台窗口显示”运行结果:{0}”C. 在控制台窗口显示”运行结果:,Console.ReadLine”D. 如果用户在控制台输入”A”,那么程序将在控制台显示”运行结果:A”10. 关于以下C#程序,下列说法正确的是( )public interface IAccount{void PostInterest;void DeductFees(int feeSchedule);}class BussinessAccount : IAccount{int A;public static void Main{BussinessAccount B = new BussinessAccount;Console.WriteLine(B.A);Console.ReadLine;}public void IAccount.PostInterest{A = A + 1;}public void IAccount.DeductFees(int feeSchedule){A = A + feeSchedule;}}A. 程序将出现编译错误,指示不能实现接口的类BussinessAccount中定义成员AB. 程序将出现编译错误,指示public关键字对接口项无效C. 程序编译正常,但出现运行时错误,指示变量A没有初始化D. 程序正常运行,输出为0C#软件工程师笔试题篇21.阅读下列代码,编译时会出错的是哪一行( )class Test{int x;static int y;void F{x = 1;? //1y = 1;? //2}static void G{x = 1;? //3y = 1;? //4}}A. (1) ?B. (2) ?C. (3) ?D. (4)2.Session对象的作用是存储特定用户的信息,Web应用程序会为每个会话建立一个Session对象,下列关于Session对象的方法与属性描述不正确的是( )A. Abandon方法可以结束当前的会话B. Clear方法清除会话状态中的所有信息,结束会话C. IsNewSession属性判定当前会话是否是一个新的会话D. Add方法向Session对象添加额外信息3.如果要制作一个网站流量的计数器应该使用以下哪个对象( )A. Application ?B. session ?C. Response ?D. Cookie4.在Web页面中使用RegularExpressionValidator控件用来检查一个控件输入信息格式是否规范,若要求输入的信息符合email的格式规范,其ValidationExpression属性应如何设置( )A. ValidationExpression = “.+@.+”B. ValidationExpression = “[a-Z].+@.+[0-9]{a,Z}”C. ValidationExpression = “[a-z][A-Z]{0-9}.@.[a-z][A-Z][0-9]”D. ValidationExpression = “[a-zA-Z0-9].@.[a-zA-Z0-9]”5. 除了C#语言能使用try/catch进行异常捕捉,也提供其他的方法处理错误,下面不是提供处理错误的方法是( )A. 在页面级错误事件中,处理单独页面上的错误事件B. 在会话级的错误事件中,处理会话中的错误事件C. 在应用程序级的错误事件中,处理应用程序中的错误事件D. 在应用程序配置文件中,为应用程序执行声明错误处理6.在页面中有如下的代码:void Button_Click(Object src,EventArgs e){Response.Write(“A”);}void Click(Object src,EventArgs e){Response.Write(“B”);}命令按钮的代码:则页面运行时,点Button按钮,将( )A. 页面输出一个字符A ?B. 页面输出一个字符BC. 页面输出字符ABD. 不会在页面输出任何字符7. 在一个开发的图书销售系统中,有一个Web窗体,窗体中有个名为DropDownListBookName的DropDownList控件,以及一个名为btn的Button控件,在btn控件的Click事件中有如下代码,点击Button按钮后,下列说法正确( )private void btn_Click(object sender,System EventArgs){string bookname = {“.NET基础:C#语言上”,”.NET基础:C#语言中”,”.NET基础:C#语言下”};ArrayList bookname Arr = new ArrayList;for(int i = 0;i < bookname.length;i++){booknameArr.Add(bookname[i].Replace(“中”,”下”));}this.DropDownListBook.DataSource = booknameArr;this.DropDownListBook.DataBind;}A. 在DropDownListBookName控件中Items集合中有两项,分别为”.NET基础:C#语言上、”.NET基础:C#语言下”B. 在DropDownListBookName控件中Items集合中有三项,分别为”.NET基础:C#语言上、”.NET基础:C#语言下、”.NET基础:C#语言下”C. 在DropDownListBookName控件中Items集合中有三项,分别为”.NET基础:C#语言上、”.NET基础:C#语言中、”.NET基础:C#语言下”D. 在DropDownListBookName控件中没有任何项8. 在.net中,Graphics对象的( )方法可以绘制直线A. DrawArc ?B. DrawLine ?C. DrawCurve ?D. DrawEllips9. 在命令行工具中执行如下语句的目的是( )WSDLA. 创建exam.asmx的WSDL文件B. 查看exam.asmx相关的WSDL文件C. 创建名为exam.cs的代理类D. 调用exam.asmx服务10. 有关托管代码描述正确的是( )A. 托管代码的执行对.NET的CLR没有依赖B. 托管代码的执行依赖.NET的CLRC. 托管代码组件调用前要先注册D. 托管代码是二进制文件C#软件工程师笔试题篇3设学生数据库中有3个关系学生关系 S(SNO,SNAME,AGE,SEX)学习关系SC(SNO,CNO,GRADE)课程关系 C(CNO,CNAME,TEACHER)以SQL Server 20xx为数据库,设计E-R图,并完成以下SQL语句:(1) 创建数据库中相关数据表(2) 编写SQL语句实现数据查询。
c语言经典笔试题(非常全)

1. 用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题)#define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL2. 写一个“标准”宏MIN,这个宏输入两个参数并返回较小的一个。
#define MIN(A,B) ((A) <= (B) (A) : (B))4. 嵌入式系统中经常要用到无限循环,你怎么样用C编写死循环呢?这个问题用几个解决方案。
我首选的方案是:while(1){}一些程序员更喜欢如下方案:for(;;){}第三个方案是用gotoLoop:...goto Loop;5. 用变量a给出下面的定义a) 一个整型数(An integer)b) 一个指向整型数的指针(A pointer to an integer)c) 一个指向指针的的指针,它指向的指针是指向一个整型数(A pointer to a pointer to an integer)d) 一个有10个整型数的数组(An array of 10 integers)e) 一个有10个指针的数组,该指针是指向一个整型数的(An array of 10 pointers to integers)f) 一个指向有10个整型数数组的指针(A pointer to an array of 10 integers)g) 一个指向函数的指针,该函数有一个整型参数并返回一个整型数(A pointer to a function that takes an integer as an argument and returns an integer)h) 一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数(An array of ten pointers to functions that take an integer argument and return an integer )答案是:a) int a; // An integerb) int *a; // A pointer to an integerc) int **a; // A pointer to a pointer to an integerd) int a[10]; // An array of 10 integerse) int *a[10]; // An array of 10 pointers to integersf) int (*a)[10]; // A pointer to an array of 10 integersg) int (*a)(int); // A pointer to a function a that takes an integer argument and returns an integerh) int (*a[10])(int); // An array of 10 pointers to functions that take an integer argument and return an integer6. 关键字static的作用是什么?这个简单的问题很少有人能回答完全。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
网络安全应具有以下五个方面的特征:保密性:信息不泄露给非授权用户、实体或过程,或供其利用的特性。
完整性:数据未经授权不能进行改变的特性。
即信息在存储或传输过程中保持不被修改、不被破坏和丢失的特性。
可用性:可被授权实体访问并按需求使用的特性。
即当需要时能否存取所需的信息。
例如网络环境下拒绝服务、破坏网络和有关系统的正常运行等都属于对可用性的攻击;可控性:对信息的传播及内容具有控制能力。
可审查性:出现安全问题时提供依据与手段第一部分:基本概念及其它问答题1、关键字static的作用是什么?这个简单的问题很少有人能回答完全。
在C语言中,关键字static有三个明显的作用:1). 在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。
2). 在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。
它是一个本地的全局变量。
3). 在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。
那就是,这个函数被限制在声明它的模块的本地范围内使用。
(本地化数据和代码范围的好处和重要性)。
2、“引用”与指针的区别是什么?答、1) 引用必须被初始化,指针不必。
2) 引用初始化以后不能被改变,指针可以改变所指的对象。
3) 不存在指向空值的引用,但是存在指向空值的指针。
指针通过某个指针变量指向一个对象后,对它所指向的变量间接操作。
程序中使用指针,程序的可读性差;而引用本身就是目标变量的别名,对引用的操作就是对目标变量的操作。
流操作符<<和>>、赋值操作符=的返回值、拷贝构造函数的参数、赋值操作符=的参数、其它情况都推荐使用引用。
3、.h头文件中的ifndef/define/endif 的作用?答:防止该头文件被重复引用。
4、#include 与#include “file.h”的区别?答:前者是从Standard Library的路径寻找和引用file.h,而后者是从当前工作路径搜寻并引用file.h。
5、描述实时系统的基本特性答:在特定时间内完成特定的任务,实时性与可靠性。
6、全局变量和局部变量在内存中是否有区别?如果有,是什么区别?答:全局变量储存在静态数据区,局部变量在堆栈中。
7、什么是平衡二叉树?答:左右子树都是平衡二叉树且左右子树的深度差值的绝对值不大于1。
8、堆栈溢出一般是由什么原因导致的?答:1.没有回收垃圾资源2.层次太深的递归调用9、冒泡排序算法的时间复杂度是什么?答:O(n^2)10、什么函数不能声明为虚函数?答:constructor11、队列和栈有什么区别?答:队列先进先出,栈后进先出12、不能做switch()的参数类型答:switch的参数不能为实型。
13、局部变量能否和全局变量重名?答:能,局部会屏蔽全局。
要用全局变量,需要使用”::”局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量。
对于有些编译器而言,在同一个函数内可以定义多个同名的局部变量,比如在两个循环体内都定义一个同名的局部变量,而那个局部变量的作用域就在那个循环体内14、如何引用一个已经定义过的全局变量?答、可以用引用头文件的方式,也可以用extern关键字,如果用引用头文件方式来引用某个在头文件中声明的全局变量,假定你将那个变量写错了,那么在编译期间会报错,如果你用extern方式引用时,假定你犯了同样的错误,那么在编译期间不会报错,而在连接期间报错。
15、全局变量可不可以定义在可被多个.C文件包含的头文件中?为什么?答、可以,在不同的C文件中以static形式来声明同名全局变量。
可以在不同的C文件中声明同名的全局变量,前提是其中只能有一个C文件中对此变量赋初值,此时连接不会出错。
16、语句for( ;1 ;)有什么问题?它是什么意思?答、和while(1)相同,无限循环。
17、do……while和while……do有什么区别?答、前一个循环一遍再判断,后一个判断以后再循环。
18、statac 全局变量、局部变量、函数与普通全局变量、局部变量、函数答、全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。
全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式。
这两者在存储方式上并无不同。
这两者的区别虽在于非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。
而静态全局变量则限制了其作用域,即只在定义该变量的源文件内有效,在同一源程序的其它源文件中不能使用它。
由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错误。
从以上分析可以看出,把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。
把全局变量改变为静态变量后是改变了它的作用域,限制了它的使用范围。
static函数与普通函数作用域不同。
仅在本文件。
只在当前源文件中使用的函数应该说明为内部函数(static),内部函数应该在当前源文件中说明和定义。
对于可在当前源文件以外使用的函数,应该在一个头文件中说明,要使用这些函数的源文件要包含这个头文件static全局变量与普通的全局变量有什么区别:static全局变量只初使化一次,防止在其他文件单元中被引用; static局部变量和普通局部变量有什么区别:static局部变量只被初始化一次,下一次依据上一次结果值;static函数与普通函数有什么区别:static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝19、程序的内存分配答:一个由c/C++编译的程序占用的内存分为以下几个部分1、栈区(stack)—由编译器自动分配释放,存放函数的参数值,局部变量的值等。
其操作方式类似于数据结构中的栈。
2、堆区(heap)—一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。
注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。
3、全局区(静态区)(static)—全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。
程序结束后由系统释放。
4、文字常量区—常量字符串就是放在这里的。
程序结束后由系统释放。
5、程序代码区—存放函数体的二进制代码例子程序这是一个前辈写的,非常详细//main.cppint a=0; //全局初始化区char *p1; //全局未初始化区main(){intb;栈char s[]=”abc”; //栈char *p2; //栈char *p3=”123456″; //123456\0在常量区,p3在栈上。
static int c=0; //全局(静态)初始化区p1 = (char*)malloc(10);p2 = (char*)malloc(20); //分配得来得10和20字节的区域就在堆区。
strcpy(p1,”123456″); //123456\0放在常量区,编译器可能会将它与p3所向”123456″优化成一个地方。
}20、解释堆和栈的区别答:堆(heap)和栈(stack)的区别(1)申请方式stack:由系统自动分配。
例如,声明在函数中一个局部变量int b;系统自动在栈中为b开辟空间heap:需要程序员自己申请,并指明大小,在c中malloc函数如p1=(char*)malloc(10);在C++中用new运算符,如p2=(char*)malloc(10);但是注意p1、p2本身是在栈中的。
(2)申请后系统的响应栈:只要栈的剩余空间大于所申请空间,系统将为程序提供内存,否则将报异常提示栈溢出。
堆:首先应该知道操作系统有一个记录空闲内存地址的链表,当系统收到程序的申请时,会遍历该链表,寻找第一个空间大于所申请空间的堆结点,然后将该结点从空闲结点链表中删除,并将该结点的空间分配给程序,另外,对于大多数系统,会在这块内存空间中的首地址处记录本次分配的大小,这样,代码中的delete语句才能正确的释放本内存空间。
另外,由于找到的堆结点的大小不一定正好等于申请的大小,系统会自动的将多余的那部分重新放入空闲链表中。
(3)申请大小的限制栈:在Windows下,栈是向低地址扩展的数据结构,是一块连续的内存的区域。
这句话的意思是栈顶的地址和栈的最大容量是系统预先规定好的,在WINDOWS下,栈的大小是2M(也有的说是1M,总之是一个编译时就确定的常数),如果申请的空间超过栈的剩余空间时,将提示overflow。
因此,能从栈获得的空间较小。
堆:堆是向高地址扩展的数据结构,是不连续的内存区域。
这是由于系统是用链表来存储的空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。
堆的大小受限于计算机系统中有效的虚拟内存。
由此可见,堆获得的空间比较灵活,也比较大。
(4)申请效率的比较:栈:由系统自动分配,速度较快。
但程序员是无法控制的。
堆:是由new分配的内存,一般速度比较慢,而且容易产生内存碎片,不过用起来最方便.另外,在WINDOWS下,最好的方式是用Virtual Alloc分配内存,他不是在堆,也不是在栈,而是直接在进程的地址空间中保留一块内存,虽然用起来最不方便。
但是速度快,也最灵活。
(5)堆和栈中的存储内容栈:在函数调用时,第一个进栈的是主函数中后的下一条指令(函数调用语句的下一条可执行语句)的地址,然后是函数的各个参数,在大多数的C编译器中,参数是由右往左入栈的,然后是函数中的局部变量。
注意静态变量是不入栈的。
当本次函数调用结束后,局部变量先出栈,然后是参数,最后栈顶指针指向最开始存的地址,也就是主函数中的下一条指令,程序由该点继续运行。
堆:一般是在堆的头部用一个字节存放堆的大小。
堆中的具体内容由程序员安排。
(6)存取效率的比较char s1[]=”aaaaaaaaaaaaaaa”; aaaaaaaaaaa是在运行时刻赋值的;char *s2=”bbbbbbbbbbbbbbbbb”; 而bbbbbbbbbbb是在编译时就确定的;但是,在以后的存取中,在栈上的数组比指针所指向的字符串(例如堆)快。
比如:#includevoidmain(){char a=1;char c[]=”1234567890″;char *p=”1234567890″;a = c[1];a = p[1];return;}对应的汇编代码10:a=c[1];004010678A4DF1movcl,byteptr[ebp-0Fh]0040106A884DFCmovbyteptr[ebp-4],cl11:a=p[1];0040106D8B55ECmovedx,dwordptr[ebp-14h]004010708A4201moval,byteptr[edx+1]004010738845FCmovbyteptr[ebp-4],al第一种在读取时直接就把字符串中的元素读到寄存器cl中,而第二种则要先把指针值读到edx中,在根据edx读取字符,显然慢了。