笔试题总结

 

c++的书详细过了一遍,决定每天做一些面试题,不仅包括编程,还包括概念,选择等。开始

1、一个学生的信息是:姓名,学号,性别,年龄等信息,用一个链表,把这些学生信息连在一起,

      给出一个age, 在些链表中删除学生年龄等于age的学生信息。

    数据结构的基本题。明天看数据结构那本书,搞定这道题。

 

 

2.

嵌入式系统经常具有要求程序员去访问某特定的内存位置的特点。在某工程中,要求设置一绝对地址

为0x67a9的整型变量的值为0xaa66。编译器是一个纯粹的ANSI编译器。写代码去完成这一任务。

    int *ptr;

  ptr=(int*)0x67a9;     //为了访问一组地址,把一个整形数强制转换为一个指针是合法的

  *ptr=0xaa66;

  

 

3.

   中断是嵌入式系统中重要的组成部分,这导致了很多编译开发商提供一种扩展—让标准C支持中断。具代表事实是,产生了一个新的关键字__interrupt。下面的代码就使用了__interrupt关键字去定义了一个中断服务子程序(ISR),请评论一下这段代码的。

__interrupt double compute_area (double radius)
{
double area = PI * radius * radius;
printf(" Area = %f", area);
return area;
}

答案:1.中断ISR 不能有返回值  2.ISR不能传递参数   .3). 在许多的处理器/编译器中,浮点一般都是不可重入的。有些处理器/编译器需要让额处的寄存器入栈,有些处理器/编译器就是不允许在ISR中做浮点运算。此外,ISR应该是短而有效率的,在ISR中做浮点运算是不明智的。
4). 与第三点一脉相承,printf()经常有重入和性能上的问题。

 

 

12 . 下面的代码输出是什么,为什么?

void foo(void)
{
unsigned int a = 6;
int b = -20;
(a+b > 6) puts("> 6") : puts("<= 6");
}

这个问题测试你是否懂得C语言中的整数自动转换原则,我发现有些开发者懂得极少这些东西。不管如何,这无符号整型问题的答案是输出是“>6”。原因是当表达式中存在有符号类型和无符号类型时所有的操作数都自动转换为无符号类型。 因此-20变成了一个非常大的正整数,所以该表达式计算出的结果大于6。这一点对于应当频繁用到无符号数据类型的嵌入式系统来说是丰常重要的。如果你答错了这个问题,你也就到了得不到这份工作的边缘。

 

 

15. Typedef 在C语言中频繁用以声明一个已经存在的数据类型的同义字。也可以用预处理器做类似的事。例如,思考一下下面的例子:
#define dPS struct s *
typedef struct s * tPS;

以上两种情况的意图都是要定义dPS 和 tPS 作为一个指向结构s指针。哪种方法更好呢?(如果有的话)为什么?
这是一个非常微妙的问题,任何人答对这个问题(正当的原因)是应当被恭喜的。答案是:typedef更好。思考下面的例子:
dPS p1,p2;
tPS p3,p4;

第一个扩展为
struct s * p1, p2;

上面的代码定义p1为一个指向结构的指,p2为一个实际的结构,这也许不是你想要的。第二个例子正确地定义了p3 和p4 两个指针。

 

16.What will print out?

main()
{
char *p1=“name”;
char *p2;
p2=(char*)malloc(20);
memset (p2, 0, 20);
while(*p2++ = *p1++);
printf(“%sn”,p2);

}

答案:空字符串

 

17.

main()
{
int x=20,y=35;
x=y++ + x++;     这里,先是 x=y+x,然后 y++,x++。得到x变成56,y变为36
y= ++y + ++x;    这里,y=57+37=94
printf(“%d%dn”,x,y);
}

 

 

18 定义一个宏,要求能输出两个数中较小的一个

  #define MIN ((A)<=(B) ? (A):(B)) 

  重点:1,宏关键字 define  2,末尾没有分号  3.参数用括号括起来

 

19. 用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题)

  #define  SECOND_PER_YEAR (60*60*24*365)UL

  重点:1.宏名大写   2,计算公式写对   3.因为结果会是个长整数,末尾加UL,代表是无符号型的长整型

 

20  预处理器#error的作用?

  停止编译并显示错误

 

21. 用变量a给出下面的定义
a) 一个整型数(An integer)
b)一个指向整型数的指针( A pointer to an integer)
c)一个指向指针的的指针,它指向的指针是指向一个整型数( A pointer to a pointer to an intege)r
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   

            b:  int  *a;

            c: int **a;

           d: int a[10]

          e: int *a[10]

           f:int (*a)[10]

         g: int (*a)(int)

         h: int (*a[10]))(int)

 

 

22 static的作用

    1)在函数题内,声明为static的变量,不会因为函数的调用而改变值

    2)在模块内,(函数体外),声明为static的变量,不能被其他模块内的函数调用

    3)在模块内,声明为static的函数,不能被其他模块内函数调用

 

23.const的作用

       代表着只读,只能在说明时初始化,以后不能赋值

以下含义理解:    

const int a;           代表a是个整型常变量
int const a;              如上,相同
const int *a;               const放在前面。是修饰变量a的,代表是个常量的指针,常量不能变,指针可以变,可以指向别处 
int * const a;         const修饰的是指针,代表指针常量,指针不能指向别人,但是常量的值可以改变
int const * a const;          指向常量的常指针,

 

 

24 Volatile 的作用

     

一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。下面是volatile变量的几个例子:
1) 并行设备的硬件寄存器(如:状态寄存器)
2) 一个中断服务子程序中会访问到的非自动变量(Non-automatic variables)
3) 多线程应用中被几个任务共享的变量

 

 

1.写出判断ABCD四个表达式的是否正确, 若正确, 写出经过表达式中 a的值(3分)
int a = 4;
(A)a += (a++); (B) a += (++a) ;(C) (a++) += a;(D) (++a) += (a++);
a = ?
答:C错误,左侧不是一个有效变量,不能赋值,可改为(++a) += a;
改后答案依次为9,10,10,11

 

3在C++ 程序中调用被 C 编

译器编译后的函数,为什么要加 extern “C”声明?
答:函数和变量被C++编译后在符号库中的名字与C语言的不同,被extern "C"修饰的变
量和函数是按照C语言方式编译和连接的。由于编译后的名字不同,C++程序不能直接调
用C 函数。C++提供了一个C 连接交换指定符号extern“C”来解决这个问题。

4.编写strcat函数,

   void  my_strcat(char *s, char *ct)

{

  char *cp=s;

   while(*cp)   cp++; 

   while(*cp++=*ct++)

   return dst;

}

 

7.C++中为什么用模板类。
答:(1)可用来创建动态增长和减小的数据结构
(2)它是类型无关的,因此具有很高的可复用性。
(3)它在编译时而不是运行时检查数据类型,保证了类型安全
(4)它是平台无关的,可移植性
(5)可用于基本数据类型

 

 

15函数模板与类模板有什么区别?
答:函数模板的实例化是由编译程序在处理函数调用时自动完成的,而类模板的实例化
必须由程序员在程序中显式地指定。

 

16.对数据库的一张表进行操作,同时又要对另一张表进行操作,怎么办

  答案:将操作多个表的操作放到事务中处理

 

17.TCP/IP建立连接的过程

 答案: 通过三次握手。

  首先,建立连接,由客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认

  其次,第二次握手,服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个syn包(syn=看),即SYN+ACK包,

  此时服务器进入SYN_RECV状态

  第三次握手,客户端收到SYN包,向服务器发送确认包 ACK(ack=k+1)

  此包发送完毕,客户端和服务器进入ESTATLISHED状态,完成三次握手

 

18.ICMP协议:  Internet控制报文协议,处于网络层(IP层)

 

2.引用与指针有什么区别?
    1) 引用必须被初始化,指针不必。
    2) 引用初始化以后不能被改变,指针可以改变所指的对象。
    3) 不存在指向空值的引用,但是存在指向空值的指针。

    4)数组名不能被引用,但可以是指针。

 

9.写出float x 与“零值”比较的if语句。

    if(abs(x)<0.000001)

 

10.Internet采用哪种网络协议?该协议的主要层次结构?
      Tcp/Ip协议
      主要层次结构为: 应用层/传输层/网络层/数据链路层/物理层。

 

 

11.Internet物理地址和IP地址转换采用什么协议?
      ARP (Address Resolution Protocol)(地址解析協議) 地址解析协议

 

 

12.IP地址的编码分为哪俩部分?
     IP地址由两部分组成,网络号和主机号。不过是要和“子网掩码”按位与上之后才能区分哪些是网络位哪些是主机位。

 

 

13 软件开发包括哪些步骤

   1.规划阶段:开发计划,质量计划,测试计划 需要产生什么文档,用到什么工具

   2.概要设计阶段:需求分析,概要设计,

   3.详细设计阶段:详细设计,部分编码

   4.编码测试阶段:编码, 测试及报告

  5.完成阶段:操作手册,用户手册,维护说明

 

 

  

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值