首页 > 用户发贴区 > 编程问题提问区 > 求几道笔试题的解答
2009
01-02

求几道笔试题的解答


————————————————-

1、下面程序输出结果是什么?

void main(){

       char
ch1 = 64;

       char
ch2 = 64;

       ch1
*= 2;

       ch1
<<= 1;

       printf(“\n%d—-%d”,ch1,ch2);

       ch1
/= 2;

       ch2
>>= 1;

       printf(“\n%d—-%d”,ch1,ch2);

}

答案:

       -128—-128

         -64—-64

疑惑:

       01000000乘以2和右移1位有什么区别,请详细解释

————————————————-

2、


#include <stdio.h>

#include <string.h>

class A{

     
public:     

     
A(){m_a = 5;}

     
virtual ~A(){}

     
void print(){printf(“\na \t%d”,m_a);}

     
protected:

     
int m_a;

};

int main(){

    A
*p = new A;

   
memset(p,0,sizeof(A));

   
p->print();

   
delete p;

       return
0;

}

答案:

       程序输出:a         0

       程序最后崩溃。

疑惑:

    为什么能正常输出,但程序却要崩溃?或者既然程序崩溃,为什么还能正常输出?

————————————————-


3、

#include <stdio.h>

class A{

public:

       void
func(){

              print();

       }

       virtual
void virtualFunc(){

              print();

       }

       virtual
void print(){

              printf(“\nAAAAAAA”);

       }

};

class B : public A{

public:

       virtual
void virtualFunc(){

              print();

       }

       virtual
void print(){

              printf(“\nBBBBBBBB”);

       }

};

int main(){

       B
*pb = new B;

       A
*pa = pb;

       pa->func();

       pa->virtualFunc();

       pb->func();

       pb->virtualFunc();

       return
0;

}

输出结果:

       BBBBBBBB

       BBBBBBBB

       BBBBBBBB

       BBBBBBBB

疑惑:

      func()不是虚函数,为什么pa->func()调用的是B的print();

————————————————-

4、


#include <stdio.h>

 

void func(int a, int *p){

       int
c;

       printf(“\n&a\t=\t%p\n&p\t=\t%p\np\t=\t%p\n&c\t=\t%p”,&a,&p,p,&c);

}

int main(){

       int
a=0,b=0;

       func(a,
&b);

       return
0;

}

比较&a,&p,p,&c的大小

答案:

       p>&p>&a>&c

       &a          =      
0012FF24

       &p          =      
0012FF28

       p            =       0012FF78

       &c          =      
0012FF18

疑惑:

      除了栈的生长方向,应该还考变量定义的顺序,是不是?请把详细过程解释一下?顺便说说栈生长方向的问题(你们总是说X86的栈向上/下生长,可并没有说哪头是大地址,请不要展现自己已经具有足够的忽悠力)。

————————————————-

5、


#include <stdio.h>

#include <string.h>

int main(){

       int
age = 22;

       char
*name = “my name is “;

       printf(“%s%d”,name);

       return
0;

}

答案:

my name is [一个随机数]

疑惑:

%d所取的是不是地址0的数据?不是的话,那这个随机数怎么来的,机理是什么,请解释。

————————————————-

6、


全局变量 int x 多线程操作下不需要线程锁进行同步的操作是:

a++x   bx++   cx=0

答案:

不知道。

疑惑:

请解释,最好把机理说说,我没有多线程的经验,只曾纸上谈兵

————————————————-

7、


同一个进程的现线程不共享的是:

a、栈      b、静态变量  c、全局变量  dnew出的新对象      e、代码段

答案:

不知道。

疑惑:

我想选a,可又舍不得d,题目是单选啊。到底哪一个?请给出答案,并解释。

————————————————-

8、


printffprintfsprintf哪一个执行的最快?

答案:

不确定。

疑惑:

我选printf,我的理解是,sprintf要写内存,fprintf写内存,还要写回磁盘,而printf直接输出显示。

————————————————-

9、


一共有1G的内存,win32操作系统,现在操作系统已经扎据内存512M,问还可以分配给应用程序多少内存?

答案:

不确定。

疑惑:

请给出答案,并给出理由。(依据是32位的寻址孔家的大小,还是操作系统分配的交换区的大小。若为后者,交换区怎么分配,请解释。或者还有其他依据?)

————————————————-

10、


char *p = new char[10*1024*1024];

char *q = (char*)malloc(10*1024*1024);

memset(p,0,10*1024*1024);

memset(q,0,10*1024,1024);

问:四个语句四个阶段,每个阶段执行后,操作系统分配的内存数量是多少?

————————————————-

11、


静态库a.lib中定义一个全局变量xb.exec.dll都访问a.libb.exe先把a.lib中的x设置为1,接着c.dll读取a.libx,则读取的值为多少?

————————————————-
12、


c.dll又一个全局变量x=1。现在a.exe先访问c.dll,并把x设为0,接着b.exe又读取x,则读取的值是多少?

————————————————-


13、

阻塞的socket,不设置任何选项,在接收数据过程中,对方掉电,则结果怎样?

————————————————-

14、


上海的服务器,北京pingping的平均延迟是200ms,丢包率是5%,则实际传输中平均延迟和延迟变化怎样?


————————————————-

以上问题,求前辈指点,请讲解的尽量。




求几道笔试题的解答》有 1 条评论

  1. xstar 说:

    ————————————————-

    1、一个是算术操作一个是位操作,位操作相对快一点,在一定情况下可以用位操作代替算术操作来优化速度.
    ————————————————-

    2、这个看类在内存中的分布情况的,memset(p,0,sizeof(A));具体覆盖了哪些内存,是否有把print覆盖掉!这里看来是每覆盖掉.
    ————————————————-

    3、似乎也是覆盖问题,print是虚函数!C++不太清楚了.呵呵

    ————————————————-

    4、不清楚你具体想得到什么样的答案,光写些地址没有任何意思.
    只有两点确定:内存分配使用一般从低地址开始,保存变量也是一样,从低地址开始保存;栈这种结构也是栈底一般是低地址,栈顶一般是高地址!
    然后确定c语言的内存分布(先定义的参数保存在前还是保存在后),参数传递的方式(从左开始入栈还是从右开始入栈,c和pascal的方式不一样,为了两者写的程序可以连接,有定义特定方式的,是pascal的方式),内联问题(函数调用的开销比较大,为了速度,编译器会直接把函数的代码代入调用的地方,然后把有些中间变量优化一下,包括保存的地址等)

    ————————————————-

    5、程序中printf写完整了吗?自己查查!

    ————————————————-

    6、锁是为了你在操作过程中防止别人修改了数据,而你又按原来的数值来操作;
    下面这三个都是涉及了值的改变,都需要做锁同步操作.
    改变x的值有三个原子操作.
    分别是:a)获取x的值,b)对x进行计算,c)把计算结果赋值给x;
    当两个人同时操作的时候.a1,b1,c1,a2,b2,c2和a1,a2,b1,b2,c1,c2这两种计算过程会得到不同的结果.
    所以要锁定三个原子操作,当作一个操作来!即(a1,b1,c1),(a2,b2,c2)或(a2,b2,c2),(a1,b1,c1);

    ————————————————-

    7、我也选栈,理由是:函数参数传递要用到栈,各个线程中同时调用函数必须保证不互相安全,线程安全的函数他的栈是私有的,也就是各个线程中有各自的栈(不能共享的,否则是线程不安全函数,需要考虑用锁的机制),new出来的新对象,是个指针,同一进程内线程线程共享进程的空间,只要参数传递得当,任何线程都可以访问新对象.而且设计得当的对象是线程安全的.

    ————————————————-

    8、没测试过,不做评论,不过有一点是对屏幕输出是很慢的.
    其他的自己写个程序测试一下吧,另外fprintf似乎也可以向屏幕写东西,获取输出的操作符,然后用fprintf输出.

    ————————————————-

    9、小于等于512M!不用考虑这么多,不然就没答案了!各个操作系统实现不同,具体到是否真的可以使用512M内存是不确定的.

    ————————————————-

    10、1)10*1024*1024 2)2*10*1024*1024 3)同2 4)同2

    实际占用量如何看系统在管理内存的时候需要多少内存.

    ————————————————-

    11、看你如何设计这个变量,是要在不同进程间共享呢还是只在本进程中共享呢?
    进程间数据通信多看看!

    ————————————————-
    12、同上

    ————————————————-

    13、看你程序设计编写如何,各类异常情况都可以在socket中检测到,包括对方非正常退出!
    另一答案就是你接收的数据不完整!!

    ————————————————-

    14、不清楚你要什么样的答案,ping的这两个参数表明一个是连接速度如何,一个是稳定性如何!实际如何变化看网络!
    这两个参数只表示你测试的那个时刻的网络情况.

    ————————————————-

     

留下一个回复