————————————————-
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 b、x++ c、x=0
答案:
不知道。
疑惑:
请解释,最好把机理说说,我没有多线程的经验,只曾纸上谈兵
————————————————-
7、
同一个进程的现线程不共享的是:
a、栈 b、静态变量 c、全局变量 d、new出的新对象 e、代码段
答案:
不知道。
疑惑:
我想选a,可又舍不得d,题目是单选啊。到底哪一个?请给出答案,并解释。
————————————————-
8、
printf,fprintf,sprintf哪一个执行的最快?
答案:
不确定。
疑惑:
我选printf,我的理解是,sprintf要写内存,fprintf写内存,还要写回磁盘,而printf直接输出显示。
————————————————-
9、
一共有
答案:
不确定。
疑惑:
请给出答案,并给出理由。(依据是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中定义一个全局变量x。b.exe和c.dll都访问a.lib。b.exe先把a.lib中的x设置为1,接着c.dll读取a.lib的x,则读取的值为多少?
————————————————-
12、
c.dll又一个全局变量x=1。现在a.exe先访问c.dll,并把x设为0,接着b.exe又读取x,则读取的值是多少?
————————————————-
13、
阻塞的socket,不设置任何选项,在接收数据过程中,对方掉电,则结果怎样?
————————————————-
14、
上海的服务器,北京ping,ping的平均延迟是200ms,丢包率是5%,则实际传输中平均延迟和延迟变化怎样?
————————————————-
以上问题,求前辈指点,请讲解的尽量。
>> 本文固定链接: http://www.vcgood.com/archives/2988
>> 转载请注明: caterpilar 2009年01月02日 于 C语言帝国 发表
————————————————-
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的这两个参数表明一个是连接速度如何,一个是稳定性如何!实际如何变化看网络!
这两个参数只表示你测试的那个时刻的网络情况.
————————————————-