华为面试题:怎么判断链表中是否有环?????
silver6 | 28 十一月, 2005 08:47
定义两个指针,一前一后,同时移动,前面的移动比后面的慢,如果是循环的则后面的肯定会追上前面的
bool CircleInList(Link* pHead)
{
if(pHead == NULL || pHead->next == NULL)//无节点或只有一个节点并且无自环
{
return (false);
}
if(pHead->next == pHead)//自环
{
return (true);
}
Link *pTemp1 = pHead;//step 1
Link *pTemp = pHead->next;//step 2
while(pTemp != pTemp1 && pTemp != NULL && pTemp->next != NULL)
{
pTemp1 = pTemp1->next;
pTemp = pTemp->next->next;
}
if(pTemp == pTemp1)
{
return (true);
}
return (false);
}
<!--
一道笔试题不理解
silver6 | 25 十一月, 2005 23:36
main()
{
int a[5]={1,2,3,4,5};
int *ptr=(int *)(&a+1);
printf("%d,%d",*(a+1),*(ptr-1));
}
int *ptr=(int *)(&a+1); //指向整个数组末尾
int *ptr=(int *)(a+1); //指向a的下一个元素
main()
{
int a[5]={1,2,3,4,5};
int *ptr=(int *)(&a+1);
printf("%d,%d",*(a+1),*(ptr-1));
}
cout<cout<因为 int *ptr=(int *)(&a+1);
这里是(&a +1) 而非 a+1
&a的类型是数组,所以加1的话,系统会认为加一个a数组的偏移,即5个int
&a+1就是首地址+1
主要是(int*)做了操作,具体什么操作也不是很了解。等高手回答。
如果
&a0x0012ff6c ""
则
&a+10x0012ff6d ""
这里
int *ptr=(int *)(&a+1);
ptr的地址和(&a +1)的地址并不相同
等待高手回答(int *)做了什么操作
&a[0] 才是首地址。
&a是指向首地址的指针。
事实证明:
*(a+1)就是a[1],*(ptr-1)就是a[4]
执行结果是2,5
&a+1不是首地址+1,系统会认为加一个a数组的偏移,是偏移了一个数组的大小(本例是5个int)
,&a可以认为是整个数组的地址,因此不能单纯的用首地址+1。
1.int * 是强制转换为int型指针。
2.对于int a[5]={1,2,3,4,5};a就是数组首地址。a+1是首地址+1. a 等价于&a[0].
3. &a不是首地址,可以看作是整个数组的指针。&a+1是 a[5]后面的地址.
&a+1≠a+1
废话少说;接:2,5
int a[5]={1,2,3,4,5};
//
// &a 指向是 a[5]的类型, &a + 1指向下一个a[5]类型,等同于指向第6(索引为5)个int
// int *ptr = (int*)(&a + 1) 强制转换指针为int*
int *ptr=(int *)(&a+1);
printf("%d,%d",*(a+1),*(ptr-1)); //ptr - 1 指向上一个int,即索引号为4的整数
int *ptr=(int *)(&a+1);
则ptr实际是&(a[5]),也就是a+5
原因如下:
&a是数组指针,其类型为 int (*)[5];
而指针加1要根据指针类型加上一定的值,
不同类型的指针+1之后增加的大小不同
a是长度为5的int数组指针,所以要加 5*sizeof(int)
所以ptr实际是a[5]
但是prt与(&a+1)类型是不一样的(这点很重要)
所以prt-1只会减去sizeof(int*)
int *ptr=(int *)(&a);
0040105B lea eax,[ebp-14h] ;a[0]的地址
0040105E mov dword ptr [ebp-18h],eax
int *ptr=(int *)(&a+1);
0040105B lea eax,[ebp] ;这里比上边增加了14h,即20个字节
0040105E mov dword ptr [ebp-18h],eax
&a是数组指针,其类型为 int (*)[5];
同意,谭浩强的c语言编程里讲的很清楚!
<!--
面试题!!!
silver6 | 25 十一月, 2005 23:34
1.全局变量和局部变量有什么区别?实怎么实现的?操作系统和编译器是怎么知道的?
2.请问交换机和路由器分别的实现原理是什么?分别在哪个层次上面实现的?
3.请你详细的解释一下IP协议的定义,在哪个层上面,主要有什么作用? TCP与UDP呢?
4.以下代码有什么问题?
struct Test
{
Test( int ) {}
Test() {}
void fun() {}
};
void main( void )
{
Test a(1);
a.fun();
Test b();
b.fun();
}
5.写一个函数,将其中的t都转换成4个空格。
都是华为的老题
1、全局变量是整个程序都可访问的变量,谁都可以访问,生存期在整个程序从运行到结束(在程序结束时所占内存释放),而局部变量存在于模块(子程序,函数)中,只有所在模块可以访问,其他模块不可直接访问,模块结束(函数调用完毕),局部变量消失,所占据的内存释放。
全局变量分配在全局数据段并且在程序开始运行的时候被加载. 局部变量则分配在堆栈里面。
2、交换机用在局域网中,交换机通过纪录局域网内各节点机器的MAC地质(物理地址)就可以实现传递报文,无需看报文中的IP地质。路由器识别不同网络的方法是通过识别不同网络的网络ID号(IP地址的高端部分)进行的,所以为了保证路由成功,每个网络都必须有一个唯一的网络编号。路由器通过察看报文中IP地址,来决定路径,向那个子网(下一跳)路由,也就是说交换机工作在数据链路层看MAC地址,路由器工作在网际层看IP地质
但是由于现在网络设备的发展,很多设备既有交换机的功能有由路由器的功能(交换试路由器)使得两者界限越来越模糊。
3、IP协议是网络层的协议,它实现了Internet中自动路由的功能,即寻径的功能,TCP协议是一个传输性的协议它向下屏蔽了IP协议不可靠传输的特性,向上提供一个可靠的点到点的传输,UDP提供的是一种无连接的服务,主要考虑到很多应用不需要可靠的连接,但需要快速的传输
4、
Test b();//定义了一个函数
一道外企软件公司笔试题
silver6 | 23 十一月, 2005 16:58
Given the following,
1.class X2{
2. public X2 x;
3. public static void main(String[] args){
4. X2 x2=new X2();
5. X2 x3=new X2();
6. x2.x=x3;
7. x3.x=x2;
8. x2=new X2();
9. x3=x2;
10. doComplexStuff();
11.}
12.}
after line 9 runs,how many objects are eligible for garbage collection?
A.0 B.1 C.2 D.3 E.4
8. x2=new X2();
9. x3=x2;
这时只有第8行的这个new X2对象被引用,所以不被回收,其余的第4,5 行的对象new X2()没有被引用所以被垃圾回收,所以我认为是2个。
我觉得是2。
到第9行时,
4. X2 x2=new X2();
5. X2 x3=new X2();
可以回收,而9. x3=x2;则是
x3、x2共同指向8.x2=new X2();创建的对象。
所以是2。
应该是2.
为什么楼上的感觉是 3 个呢?我感觉不出来3 个。
创建了3个对象,2个成为了垃圾。8、9行的代码说明有两个引用指向对象3#。
public class GcTest {
public GcTest g;
public static void main(String[] args) {
GcTest x2 = new GcTest();
GcTest x3 = new GcTest();
x2.g = x3;
x3.g = x2;
x2 = new GcTest();
x3=x2;
System.gc();
}
@Override
protected void finalize() throws Throwable {
System.out.println("clear");
}
}
测试了一下,输出2次clear
To gemouzhi:没感觉、感觉不出来?不要这样说。
既然有2个人说3,就想听听为什么。
测试的代码,上面 simbas00给了。
To sussman:我的详细的解释。
这个题糊弄人的地方,在
2. public X2 x;
因此,要清楚引用变量(或者叫句柄)和对象是不同的两个东西。句柄将持有对象的ref,它不是对象。有几个句柄?4个,x2、x3、x2.x和x3.x,程序中有几个对象?数new出现的次数(Class的那个方法这里不考虑)。3个。
垃圾对象是引用全部失效的对象,
6. x2.x=x3;
7. x3.x=x2;
说明,对象1#和2#的引用曾经被x3.x和x2.x持有,当
8. x2=new X2();
9. x3=x2;
8后,x2.x为null,9之后,x3.x为null。因此
对象1#和2#成为垃圾。
而对象3#有句柄x2和x3持有。
x2其成员变量x的内存分配,一定在heap中。
恩,我到希望是这样,因为这样更好叫我理解,但对象的成员变量分配在heap上,你有根据吗?
有的话,给你加100分。
x2指向的对象是新对象,但是这个时候并没有进行gc,所以x2原来指向的堆上的对象还是存活的
而且我按simbas00给的代码打出x2.x都是@9664a1。这些都是小问题。
对象的成员变量分配在heap上,我还真没弄明白,你先找些根据。
这个GcTest 也是对象吧GcTest x2是她的成员吧,你的意思是x2也分配在heap上?
public class GcTest {
public GcTest g;
public static void main(String[] args) {
GcTest x2 = new GcTest();
GcTest x3 = new GcTest();
x2.g = x3;
x3.g = x2;
的代码可能有问题。
public class A {
public A g;
public static void main(String[] args) {
A x2 = new A();
System.out.println(x2.g);
A x3 = new A();
x2.g = x3;System.out.println(x2.g);
x3.g = x2;
x2 = new A();System.out.println(x2.g);
x3=x2;
System.gc();
}
@Override
protected void finalize() throws Throwable {
System.out.println("clear");
}
}
null
A@11b86e7
null
clear
clear
1.class X2{
2. public X2 x;//这个是X2的成员变量,内存组织描述在field_info里,
3. public static void main(String[] args){//主方法
4. X2 x2=new X2();//x2是X2的局部变量,分配在栈上,只是一个ref,他指向一个在heap上分配的内存new X2();,这个好象是16K,这个new X2();中的x的成员变量是和这个对象的生命周期是一样的.因为我还再查关于成员变量堆内存的组织形式.
5. X2 x3=new X2();//x3同x2
6. x2.x=x3;//这里用x2的x成员变量指向了x3也同时指向的 在heap上分配的new X2();
7. x3.x=x2;//这里用x3的x成员变量指向了x2也同时指向的 在heap上分配的new X2();
8. x2=new X2();//这里x2在栈中新指向了另一个new X2();而原来的她所指向的那个对象只有x3的x作为她的ref,到这里我认为还没有任何的垃圾.
9. x3=x2;//这步才是产生垃圾最重要的那部分,因为x3指向了新的对象,也就是说没有任何栈上的指针指向最初分配的那两个对象了.就相当于两个内存的heap上的内存块互相指着.
而这种没有栈指针依赖的对象是无法存活的.
例如你直接写这样的代码:new X2();就会利马变成垃圾.
所以在这一步同时出现了两个垃圾对象,也就是最初的两个new X2();
10.
11.}
12.}
结论: 答案是两个
我希望你能楼主和大家,当然还有yqj2065(严千钧)看一下,第8行,因为我认为这里并不产生垃圾
这是我对这个帖子的半完整解释.
遗留的问题:成员变量在heap上的组织形式.
谢谢各位观看.
这道题似乎没有那么复杂,支持选 C 回收了 2 个,试解释如下:
Given the following,
1.class X2{
2. public X2 x;
3. public static void main(String[] args){
4. X2 x2=new X2();
5. X2 x3=new X2();
6. x2.x=x3;
7. x3.x=x2;
8. x2=new X2();
9. x3=x2;
10. doComplexStuff();
11.}
12.}
after line 9 runs,how many objects are eligible for garbage collection?
A.0 B.1 C.2 D.3 E.4
--
运行到line 5时,共创建了 2 个实例,并且交叉赋值给 x2, x2.x, x3, x3.x
这没有什么特别的,概括地讲也就是说:
x2,x3分别持有一个实例,同时根据成员变量x可以访问另外一个。
--
运行到line 8时,情况发生了变化,x2指向一个新的实例(x2.x自然而然也就null了)
此时
x2持有第 3 个实例,但 x2.x = null (并不指向任何实例)
由于 x3 及 x3.x 仍然持有前面创建的 2 个实例,所以目前还没有对象被释放。
--
运行到line 9时,x3也指向新的实例(和x2引用同一个实例)
此时
x3原来持有的实例被释放
能够通过 x3.x 访问的实例也被释放
--
用符号ABC表示实例就是从
x2 -> A
x2.x -> B
x3 -> B
x3.x -> A
最终演变为
x2 -> C
x2.x is null
x3 -> C
x3.x is null
至此 A 和 B 将被 gc
答案是2个,没问题。但是使用finalize的测试是不对的。
上面大家分析的已经很不错了,我只是想说说上面的finalize的测试方法为什么是错误的?!
我们知道gc是个不确定的行为,我们无法控制,JVM回收垃圾一直都是不可控的。
我认为这个题目出的比较好,如果这个代码
public class GcTest {
public GcTest g;
public static void main(String[] args) {
GcTest x2 = new GcTest();
GcTest x3 = new GcTest();
x2.g = x3;
x3.g = x2;
x2 = new GcTest();
x3=x2;
System.gc();
}
@Override
protected void finalize() throws Throwable {
System.out.println("clear");
}
}
输出多少次clear我觉得都是没有问题的,(当然不会超过3次,因为一共就创建了3个对象)。这个代码和题目是不一样的。
题目中line9之后还有line10,这个是非常重要的,也就是说line9之后这个方法的作用域还没有结束,这时候符合垃圾回收的对象应该是
1。null
2。没有被引用的对象
而line10之后,就会有“结束作用域的局部对象”也符合垃圾回收的条件。
上面的finalize的测试就是犯了这个错误,实际上你这里按照题目的问题应该是3个对象,因为按照上面3条原则,创建的3个对象都是局部的,所以结束了函数作用域一定都符合垃圾回收的条件。之所有只输出了2次clear是因为gc是不确定的,这里gc了2个对象而已,但是符合垃圾回收的对象是3个!
几个笔试题
silver6 | 23 十一月, 2005 16:55
1 比较下面三种软件出错方式处理的优缺点!
1)发现错误时,抛出异常。
2)用函数的返回值判断程序是否正常。
3)在函数的参数中设置一个引用类型的参数(指针),用这个参数的返回值判断程序是正确还是错误。
2 说说你对OOA(面向对象分析),OOD(面向对象设计),OOP(面向对象编程)的理解。
3 你认为掌握哪些知识或能力,可认为精通或熟悉J2EE下的应用开发!
小弟是第一次应聘,遇到这样的题,乱写一气!呵呵!!
请大家谈谈自己的想法,谢谢了!!
查看全文 <!--JavaBean与Java的区别
silver6 | 15 十一月, 2005 17:40对于初学JSP又没学过Java,之后又觉得不学Java,Jsp实在做不好,遂又开始学Java,Java学了不多久忽然又觉得JavaBean对Jsp比较重要,开始试着编写JavaBean的我来说。如果不把Java与JavaBean分清楚的话还不如去当老干妈或者阿香婆,反正是做酱的。 我是什么时候开始意识到Java与JavaBean有区别的呢?当然看书是看不来的,本人对书都是一目十行的。在这就不具体写我所遇到的混乱了,那只会让已经混乱的人更混乱,不混乱的人笑疯掉。不过还是要感谢QQJava牛棚群的饼干,真是一句话点醒梦中人那,他说:“那是JSP的语法”(原话忘记了见谅),但是之后他又说了一句名言,他说:“他们本来就不是一个东西”。导致我开始想他们之间的区别。 进入正题: 1.明确JavaBean是Java的一个类。既然是类那么我们就直接去用它的接口就行了,其他的对于初学者无需考虑(其实是本人水平有限)。 2.三个规则。 |——无参构建子,本人认为就是初始化Bean要得到的参数即类的变量。 |——Sreializable Interface,基本上不用管了。 |——拥有Property Interface,这才是以下要着重说的。 JavaBean中有了两类著名的方法: Set方法——方法名以set开头,用于接收从页面传到Bean的值。 public String setName(String name) { this.name=name } Get方法——方法名以get开头,用于从Bean传值到页面。 public String getName() { return (name); } 如果我们要在页面调用JavaBean有两种形式 1. 用JSP的动作下配合使用。 当 property="*" 说明由表单直接提交多个值到Bean里,据我目前的水平,认为这是唯一会用到setProperty的地方。 这句话具体调用的是上面出现过的getName方法,要注意这个Property="name",在这个标签里写所以省略了get而且首字母变为小写。 据QQJava牛棚群的高人饼干说,命名Bean的方法时get或set方法后面的第一个字母要大写,调用时省略get或set,并且首字母也小写。(目前本人认为这种说法仅限于Jsp的这两个标签里)。 2.直接调用 在声明过useBean动作后 a.setXXX("...");//调用set方法传值给Bean a.getXXX("...");//调用get方法得到return的值 注意:此时函数名要写全 下面将举个本人自己写的JavaBean作具体解说,本人问过高人了,据说是没有概念错误,但是没有调试过望大家海涵。 /* import db.Conndb; import java.sql.*; public class bulildtable { private String type=null; private String name=null; //无参建构子(本人自认为) public void setName(String name) //得到值 { this.name=name; } public void setType(String type) { this.type=type; } public String [] Type(String type) //实现Bean功能的方法1 { Conndb conn=new Conndb(); String sql="select * form. devtype where type='"+type+"'"; ResultSet=conn.executeQuery(sql); if(rs.next()) { String [] tt=new String[16]; for(int i=0;i<16;i++) { tt[i]=rs.getString("no"+(i+1)); } } return(tt); } public int typecount(String [] type) //实现Bean功能的方法2 { int j=0; for(int i=0;i<16;i++) { if(!tt[i].equals()&&(tt[i]!=null)) { j++; } } return (j); } public String [] CreatArray() //实现Bean功能的方法3 { int j=typecount(Type(type)); String [] type=Type(type); String [] tt=new String [j]; for(int i=0;i-1){ sql.append(list.get(n)).append(" varchar(20)"); } sql.append(")"); return(sql.toString()); } //该段由Java程序员讨论群的Jonson提供。 */ 除去以上讲的还要加上一些注意 1.JavaBean应该是没有main方法。 似乎是因为 public static void main(String[] args) { getnameBean getnamebean = new getnameBean(); }//不太清楚因为高人没给咱讲明白。 剩下的部分就一样了。 恕本人水平有限,我认为已经把Java与JavaBean的区别说得比较清楚了,另外还有哪些不足,希望看过此文的诸位可以知无不言,言无不尽,觉得在下写得实在是误人子弟的请大声的骂出来,如果不能回帖或者觉得只回帖骂在下不过瘾的,可以给我发垃圾邮件。 参考书籍:JSP工程应用与项目实践,塞奎春,机械工业出版社 请教高人:Java牛棚 富丽饼干,魔之卡卡,双面人.... Java程序员讨论 Jonson,雨婷.... 最后要说的,本文采用古龙后期作品的自然段分段方式,祝大家阅读愉快。
网易面试,问atoi实现的效率改进问题
silver6 | 10 十一月, 2005 08:58
今天去一面,面试官云风要我把笔试时做的atoi实现改进一下,我想了半天,终于想出一点,即确定某字符所在的万、千、百、十位后,本来是循环乘10,我说可以做一个数组里面就放上10000,1000,100,10,1,找到位数后直接索引再乘那个字符,这样多次乘法就减为一次了。可是云风说还可以改进,然后提示除了在数组里放上10000,1000,100,10,1之外还可以放别的数,甚至多位一起乘,当时真是紧张,完全没明白!
哪位高手指点一下?要是还有二面,我就好答了。我先去debug一下tc库里atoi的实现吧,等看懂了再来帖~
这是我刚开始学C++的时候,不知道C++里有可以把字符串转换成数字的函数是什么时,自己写的一个函数:
int strtoint(string s)
{
if (s[0] != '-')
{
s = "+" + s;
}
int n = 0;
for(int i = 1, l = s.size();i < l;i++)
{
if ((s[i] > 57)||(s[i] < 48))
{
cerr << "Please enter integrity!" << 'n';
system("pause");
exit(1);
}
n = n * 10 + (s[i] - 48);
}
if (s[0] == '-')
n = -1 * n;
return n;
}
最简单的是调试跟进去,前提是你已经安装了CRT的源代码,我VC7看到的代码是这样的:
long __cdecl _tstol(
const _TCHAR *nptr
)
{
int c; /* current char */
long total; /* current total */
int sign; /* if '-', then negative, otherwise positive */
#if defined (_MT) && !defined (_UNICODE)
pthreadlocinfo ptloci = _getptd()->ptlocinfo;
if ( ptloci != __ptlocinfo )
ptloci = __updatetlocinfo();
/* skip whitespace */
while ( __isspace_mt(ptloci, (int)(_TUCHAR)*nptr) )
#else /* defined (_MT) && !defined (_UNICODE) */
while ( _istspace((int)(_TUCHAR)*nptr) )
#endif /* defined (_MT) && !defined (_UNICODE) */
++nptr;
c = (int)(_TUCHAR)*nptr++;
sign = c; /* save sign indication */
if (c == _T('-') || c == _T('+'))
c = (int)(_TUCHAR)*nptr++; /* skip sign */
total = 0;
while ( (c = _tchartodigit(c)) != -1 ) {
total = 10 * total + c; /* accumulate digit */
c = (_TUCHAR)*nptr++; /* get next char */
}
if (sign == '-')
return -total;
else
return total; /* return result, negated if necessary */
}
#define _tchartodigit(c) ((c) >= '0' && (c) <= '9' ? (c) - '0' : -1)
int StrToInt(char* str)
{
int total=0;
while(*str != 0)
{
total = total * 10 + (int)(*str - '0');
}
return total;
}
long __cdecl atol(
const char *nptr
)
{
int c; /* current char */
long total; /* current total */
int sign; /* if '-', then negative, otherwise positive */
/* skip whitespace */
while ( isspace((int)(unsigned char)*nptr) )
++nptr;
c = (int)(unsigned char)*nptr++;
sign = c; /* save sign indication */
if (c == '-' || c == '+')
c = (int)(unsigned char)*nptr++; /* skip sign */
total = 0;
while (isdigit(c)) {
total = 10 * total + (c - '0'); /* accumulate digit */
c = (int)(unsigned char)*nptr++; /* get next char */
}
if (sign == '-')
return -total;
else
return total; /* return result, negated if necessary */
}
vc6下的源码。 atoi 也是调用 atol
<!--
几道笔试题目
silver6 | 10 十一月, 2005 08:55
1.设计函数 int atoi(char *s)
2. What do the following declarations mean?
(1)const int a;
(2)int const a;
(3)const int *a;
(4)int * const a;
(5)int const * a const;
3.编程
将整数转换成字符串:void itoa(int,char);
例如itoa(-123,s[])则s=“-123”;
4.10个人分成4组 有几种分法?(程序)(不能重复,如:1,1,1,7=7,1,1,1)
5.如图:
7 8 9 10
6 1 2 11
5 4 3 12
16 15 14 13
设“1”的坐标为(0,0) “7”的坐标为(-1,-1) 编写一个小程序,使程序做到输入坐标(X,Y)之后显示出相应的数字。
6.编最优化Bubble(int *pIntArray,int L),要求:交换元素不能用临时变量,如果有序需要最优。
6.
void bubble(int* pSrc,int length)
{
int i,j;
for(i=n;i>2;i--)
{
for(j=1;j{
if(pSrc[j]>pSrc[j+1])
{
pSrc[j]=pSrc[j]^pSrc[j+1];
pSrc[j+1]=pSrc[j+1]^pSrc[j];
pSrc[j]=pSrc[j]^pSrc[j+1];
}
}
}
}
1.
int atoi(char *s)
{
int result = 0;
int i, j, m, temp;
char c;
j = 0;
while(s[j]!='')
{
j++;
}
for(i=j-1;i>=0;i--)
{
c = s[i];
temp = c - '0';
for(m=0;m{
temp = temp*10;
}
result = result + temp;
printf("c=%d, temp=%d, result=%dn", c, temp, result);
}
return result;
}
2,(1)const int a;表示常量
(2)int const a;表示常量
(3)const int *a;指针a指向的数据不允许改变
(4)int * const a;指针a的地址不变
(5)int const * a const;地址,数据都不允许改变
6.最优
void bubble(int *a,int n)
{
int i,j,change;
for(i=1,change=1; i{
change = 0;
for (j=0; jif (a[j] > a[j+1])
{
a[j]=a[j]^a[j+1];
a[j+1]=a[j+1]^a[j];
a[j]=a[j]^a[j+1];
}
}
}
void bubble(int *a,int n)
{
int i,j,change;
for(i=1,change=1; i{
change = 0;
for (j=0; jif (a[j] > a[j+1])
{
a[j]=a[j]^a[j+1];
a[j+1]=a[j+1]^a[j];
a[j]=a[j]^a[j+1];
change=true;
}
}
}
5.如图:
7 8 9 10
6 1 2 11
5 4 3 12
16 15 14 13
设“1”的坐标为(0,0) “7”的坐标为(-1,-1) 编写一个小程序,使程序做到输入坐标(X,Y)之后显示出相应的数字。
#include
int x1=0,y1=0,x2=0,y2=0;
int main(){
int i,j,n,num=1;
cout<cin>>x1;
cout<cin>>y1;
for(i = 2;i < 6;i++)
for(n = 0;n < 2;n++)
for(j = 1;j < i;j++){
if(i % 2){
if(n == 0){
if((x1 == x2)&&(y1 == y2))
break;
y2--;
num++;
}
else{
if((x1 == x2)&&(y1 == y2))
break;
x2--;
num++;
}
}
else{
if(n == 0){
if((x1 == x2)&&(y1 == y2))
break;
y2++;
num++;
}
else{
if((x1 == x2)&&(y1 == y2))
break;
x2++;
num++;
}
}
}
cout<cout<return 0;
}
第五题:先找到所有平方数的位置,是有规律的:
奇数平方数1,9,25……在从1开始想右上直线延伸,4,16,36……从4开始向左下直线延伸,这样可以快速确定平方数位置。输入n,求得n两边的平方数,例如输入27,则确定25和36位置,中间从26到36的5+6=11个数位置就是联系排列,只有一个拐弯,在26+5=31处,接下来不就ok了?
<!--
C#面试题
silver6 | 10 十一月, 2005 08:53
一、选择填空题(每空2分,共60分)
1.在对SQL Server 数据库操作时应选用()。
a)SQL Server .NET Framework 数据提供程序;
b)OLE DB .NET Framework 数据提供程序;
c)ODBC .NET Framework 数据提供程序;
d)Oracle .NET Framework数据提供程序;
2.下列选项中,()是引用类型。
a)enum类型
b)struct类型
c)string类型
d)int类型
3.关于ASP.NET中的代码隐藏文件的描述正确的是()
a)Web窗体页的程序的逻辑由代码组成,这些代码的创建用于与窗体交互。编程逻辑唯一与用户界面不同的文件中。该文件称作为“代码隐藏”文件,如果用C#创建,该文件将具有“.ascx.cs”扩展名。
b)项目中所有Web窗体页的代码隐藏文件都被编译成.EXE文件。
c)项目中所有的Web窗体页的代码隐藏文件都被编译成项目动态链接库(.dll)文件。
d)以上都不正确。
4.以下描述错误的是()
a)在C++中支持抽象类而在C#中不支持抽象类。
b)C++中可在头文件中声明类的成员而在CPP文件中定义类的成员,在C#中没有头文件并且在同一处声明和定义类的成员。
c)在C#中可使用 new 修饰符显式隐藏从基类继承的成员。
d)在C#中要在派生类中重新定义基类的虚函数必须在前面加Override。
5.C#的数据类型有()
a)值类型和调用类型;
b)值类型和引用类型;
c)引用类型和关系类型;
d)关系类型和调用类型;
6.下列描述错误的是()
a)类不可以多重继承而接口可以;
b)抽象类自身可以定义成员而接口不可以;
c)抽象类和接口都不能被实例化;
d)一个类可以有多个基类和多个基接口;
7.在DOM中,装载一个XML文档的方法()
a)save方法
b)load方法
c)loadXML方法
d)send方法
8.下列关于构造函数的描述正确的是()
a)构造函数可以声明返回类型。
b)构造函数不可以用private修饰
c)构造函数必须与类名相同
d)构造函数不能带参数
9.以下是一些C#中的枚举型的定义,其中错误的用法有()
a)public enum var1{ Mike = 100, Nike = 102, Jike }
b)public enum var1{ Mike = 100, Nike, Jike }
c)public enum var1{ Mike=-1 , Nike, Jike }
d)public enum var1{ Mike , Nike , Jike }
10.int[][] myArray3=new int[3][]{new int[3]{5,6,2},new int[5]{6,9,7,8,3},new int[2]{3,2}}; myArray3[2][2]的值是()。
a)9
b)2
c)6
d)越界
11.接口是一种引用类型,在接口中可以声明(),但不可以声明公有的域或私有的成员变量。
a)方法、属性、索引器和事件;
b)方法、属性信息、属性;
c)索引器和字段;
d)事件和字段;
12.ASP.NET框架中,服务器控件是为配合Web表单工作而专门设计的。服务器控件有两种类型,它们是( )
a)HTML控件和Web控件
b)HTML控件和XML控件
c)XML控件和Web控件
d)HTML控件和IIS控件
13.ASP.NET中,在Web窗体页上注册一个用户控件,指定该控件的名称为”Mike”,正确的注册指令为( )
a)<%@Register TagPrefix = “Mike” TagName = “Space2” Src = “myX.ascx”%>
b)<%@Register TagPrefix = “Space2” TagName = “Mike” Src = “myX.ascx”%>
c)<%@Register TagPrefix = “SpaceX” TagName = “Space2” Src = “Mike”%>
d)以上皆非
14.在ADO.NET中,对于Command对象的ExecuteNonQuery()方法和ExecuteReader()方法,下面叙述错误的是()。
a)insert、update、delete等操作的Sql语句主要用ExecuteNonQuery()方法来执行;
b)ExecuteNonQuery()方法返回执行Sql语句所影响的行数。
c)Select操作的Sql语句只能由ExecuteReader()方法来执行;
d)ExecuteReader()方法返回一个DataReder对象;
15.下列ASP.NET语句(b)正确地创建了一个与SQL Server 2000数据库的连接。
a)SqlConnection con1 = new Connection(“Data Source = localhost; Integrated Security = SSPI; Initial Catalog = myDB”);
b)SqlConnection con1 = new SqlConnection(“Data Source = localhost; Integrated Security = SSPI; Initial Catalog = myDB”);
c)SqlConnection con1 = new SqlConnection(Data Source = localhost; Integrated Security = SSPI; Initial Catalog = myDB);
d)SqlConnection con1 = new OleDbConnection(“Data Source = localhost; Integrated Security = SSPI; Initial Catalog = myDB”);
16.Winform中,关于ToolBar控件的属性和事件的描述不正确的是()。
a)Buttons属性表示ToolBar控件的所有工具栏按钮
b)ButtonSize属性表示ToolBar控件上的工具栏按钮的大小,如高度和宽度
c)DropDownArrows属性表明工具栏按钮(该按钮有一列值需要以下拉方式显示)旁边是否显示下箭头键
d)ButtonClick事件在用户单击工具栏任何地方时都会触发
17.在ADO.NET中执行一个存储过程时,如果要设置输出参数则必须同时设置参数的方向和( ),必要时还要设置参数尺寸。
a)大小;
b)上限;
c)初始值;
d)类型;
18.如果将窗体的FormBoderStyle设置为None,则( )。
a)窗体没有边框并不能调整大小;
b)窗体没有边框但能调整大小;
c)窗体有边框但不能调整大小;
d)窗体是透明的;
19.如果要将窗体设置为透明的,则( )
a)要将FormBoderStyle属性设置为None;
b)要将Opacity属性设置为小于100%得值;
c)要将locked 属性设置为True;
d)要将 Enabled属性设置为True;
20.下列关于C#中索引器理解正确的是( )
a)索引器的参数必须是两个或两个以上
b)索引器的参数类型必须是整数型
c)索引器没有名字
d)以上皆非
21.下面描述错误的是( )。
a)窗体也是控件;
b)窗体也是类;
c)控件是从窗体继承来的;
d)窗体的父类是控件类;
22.要对注册表进行操作则必须包含( )。
a)System.ComponentModel命名空间;
b)System.Collections命名空间;
c)System.Threading命名空间;
d)Microsoft.Win32命名空间;
23.要创建多文档应用程序,需要将窗体的( )属性设为true。
a)DrawGrid;
b)ShowInTaskbar;
c)Enabled;
d)IsMdiContainer;
24.如果设treeView1=new TreeView(),则treeView1.Nodes.Add("根节点")返回的是一个 ()类型的值。
a)TreeNode;
b)int;
c)string;
d)TreeView;
25.下面关于XML的描述错误的是()。
a)XML提供一种描述结构化数据的方法;
b)XML 是一种简单、与平台无关并被广泛采用的标准;
c)XML文档可承载各种信息;
d)XML只是为了生成结构化文档;
.在对SQL Server 数据库操作时应选用()
a;
2.下列选项中,()是引用类型。
c)string类型//其构造函数为静态构造函数所以看起来像值类型
3.关于ASP.NET中的代码隐藏文件的描述正确的是()
c)项目中所有的Web窗体页的代码隐藏文件都被编译成项目动态链接库(.dll)文件。
4.以下描述错误的是()
a)在C++中支持抽象类而在C#中不支持抽象类。
5.C#的数据类型有()
a)值类型和调用类型;
6.下列描述错误的是()
d)一个类可以有多个基类和多个基接口;
7.在DOM中,装载一个XML文档的方法()
b)load方法
8.下列关于构造函数的描述正确的是()
c)构造函数必须与类名相同
9.以下是一些C#中的枚举型的定义,其中错误的用法有()
a)public enum var1{ Mike = 100, Nike = 102, Jike }
b)public enum var1{ Mike = 100, Nike, Jike }
c)public enum var1{ Mike=-1 , Nike, Jike }
d)public enum var1{ Mike , Nike , Jike }
??忘记了
10.int[][] myArray3=new int[3][]{new int[3]{5,6,2},new int[5]{6,9,7,8,3},new int[2]{3,2}}; myArray3[2][2]的值是()。
d)越界
11.接口是一种引用类型,在接口中可以声明(),但不可以声明公有的域或私有的成员变量。
a)方法、属性、索引器和事件;
12.ASP.NET框架中,服务器控件是为配合Web表单工作而专门设计的。服务器控件有两种类型,它们是( )
a)HTML控件和Web控件
13.ASP.NET中,在Web窗体页上注册一个用户控件,指定该控件的名称为”Mike”,正确的注册指令为( )
a)<%@Register TagPrefix = “Mike” TagName = “Space2” Src = “myX.ascx”%>
b)<%@Register TagPrefix = “Space2” TagName = “Mike” Src = “myX.ascx”%>
c)<%@Register TagPrefix = “SpaceX” TagName = “Space2” Src = “Mike”%>
d)以上皆非
14.在ADO.NET中,对于Command对象的ExecuteNonQuery()方法和ExecuteReader()方法,下面叙述错误的是()。
c)Select操作的Sql语句只能由ExecuteReader()方法来执行;
15.下列ASP.NET语句(b)正确地创建了一个与SQL Server 2000数据库的连接。
b)SqlConnection con1 = new SqlConnection(“Data Source = localhost; Integrated Security = SSPI; Initial Catalog = myDB”);
16.Winform中,关于ToolBar控件的属性和事件的描述不正确的是()。
a)Buttons属性表示ToolBar控件的所有工具栏按钮
b)ButtonSize属性表示ToolBar控件上的工具栏按钮的大小,如高度和宽度
c)DropDownArrows属性表明工具栏按钮(该按钮有一列值需要以下拉方式显示)旁边是否显示下箭头键
d)ButtonClick事件在用户单击工具栏任何地方时都会触发
17.在ADO.NET中执行一个存储过程时,如果要设置输出参数则必须同时设置参数的方向和( ),必要时还要设置参数尺寸。
b)上限;
18.如果将窗体的FormBoderStyle设置为None,则( )。
a)窗体没有边框并不能调整大小;
b)窗体没有边框但能调整大小;
c)窗体有边框但不能调整大小;
d)窗体是透明的;
19.如果要将窗体设置为透明的,则( )
b)要将Opacity属性设置为小于100%得值;
20.下列关于C#中索引器理解正确的是( )
b)索引器的参数类型必须是整数型
21.下面描述错误的是( )。
c)控件是从窗体继承来的;
22.要对注册表进行操作则必须包含( )。
a)System.ComponentModel命名空间;
b)System.Collections命名空间;
c)System.Threading命名空间;
d)Microsoft.Win32命名空间;
23.要创建多文档应用程序,需要将窗体的( )属性设为true。
d)IsMdiContainer;
24.如果设treeView1=new TreeView(),则treeView1.Nodes.Add("根节点")返回的是一个 ()类型的值。
a)TreeNode;
b)int;
c)string;
d)TreeView;
25.下面关于XML的描述错误的是()。
d)XML只是为了生成结构化文档;
刚进来就看见个垃圾问题!
1.在对SQL Server 数据库操作时应选用()。
a)SQL Server .NET Framework 数据提供程序;
b)OLE DB .NET Framework 数据提供程序;
c)ODBC .NET Framework 数据提供程序;
d)Oracle .NET Framework数据提供程序;
这个题是那个BC出的啊?
就算我不知道,难道会因为这个而没办法写程序?!
如果是的话,那么那些教材和参考书是干什么的? 还有我们这个CSDN是干什么的?
真是搞不清楚,出题的人怎么就那么喜欢搞这种死记硬背的东西.
类似的垃圾问题还很多,例如7,9,10.
9和10更是过分,这种问题直接运行不就行了,编译都过不了的问题难道会有哪个程序员会放着不管吗?
这些出题的人真是该反省一下!
<!--
一道偏理论的面试题
silver6 | 10 十一月, 2005 08:52
1。请实现一个类型,该类型只能在栈上分配,不能从堆上分配
2。请实现一个类型,该类型只能在堆上分配,不能从栈上分配
第一个问题说明显一点就是这个类不能这样使用:
CMyClass* myClass = new CMyClass();
第二个问题恰好相反只能这样使用
1。重载一个private的operator new
2。将ctor作为private,写一个public的static的CreateObject方法,在其中用new
创建object。
VIA杭州笔试题最后一道
silver6 | 03 十一月, 2005 09:07
请进行优化:
long multiple(int vertical1[], int vertical2[],int value)
{
int i =0;
int sum=0;
for(i=0;iif(i&0x01)
sum -= (vertical1[i]*vertical2[i])>>16;
else
sum += (vertical1[i]*vertical2[i])>>16;
}
return sum;
}
我的办法是去掉if,拆分成两个小循环
for(i=0;isum += (vertical1[i]*vertical2[i])>>16;
for(i=1;isum -= (vertical1[i]*vertical2[i])>>16;
然而(vertical1[i]*vertical2[i])>>16;这句该怎么优化?
int类型为32bit 范围0-ffffffff;
(vertical1[i]*vertical2[i])>>16;
相当于(vertical1[i]*vertical2[i])/65536;
我的优化方式为:
for(int i=0;isum+=(vertical1[i]*vertical2[i])>>16;
++i;
sum-=(vertical1[i]*vertical2[i])>>16;
++i;
}
long multiple(int *vertical1, int *vertical2,int value)
{
int i =0;
int sum=0;
for(int i=0;isum+=(++vertical1 * ++vertical2)>>16;
++i;
sum-=(++vertical1 * ++vertical2)>>16;
++i;
}
}
return sum;
}
把vertical[i]改成用指针的形式,每次++操作. 可能会更优化一些,
if((vertical1[i]&0xffffff00)||(vertical2&0xffffff00))
sum+=(vertical1[i]*vertical2[i])>>16;
一外企笔试题
silver6 | 03 十一月, 2005 09:04
You have four colored cubes. Each side of each cube is a single color, and there are four colors: blue (B), red (R), green (G) and yellow (Y) Describing the six faces as front, back, left, right, top, bottom, the cube colors are:
Cube Front Back Left Right Top Bottom
1 R B G Y B Y
2 R G G Y B B
3 Y B R G Y R
4 Y G B R R R
The objective is to find ways to stack the four cubes as a vertical column so that each side of the column is showing all four colors.
In a compiled language of your choice, write a program to find all successful permutations
近期各种面试题总结,
silver6 | 02 十一月, 2005 09:25
1)sizeof相关系列问题
2)const相关系列问题
3)大量林锐书的习题,以及各种变种
这三个几乎是每次必出现
下面的这些是程序相关题,很多都是以前有讨论过的,还请各位大侠能整理个比较适合做面试时答案的解答,多谢了.最好能给出讨论链接,让我等后辈有学习的机会.
1)求出相似度的算法.
2)写出二分查找的代码.
3)写出在母串中查找子串出现次数的代码.
*4)写出快速排序或者某种排序算法代码
出现次数相当频繁
5)写出查找从一个集合中输出所有子集合的算法.
*6)实现strcpy函数
出现次数相当频繁
*7)实现strcmp函数
出现次数相当频繁
8)将一个单链表逆序
9)循环链表的节点对换和删除。
*10)将一个数字字符串转换为数字."1234" -->1234
出现次数相当频繁
11)实现任意长度的整数相加或者相乘功能。
*12)写函数完成内存的拷贝
威盛的一道笔试题
silver6 | 02 十一月, 2005 09:20
#include
char *returnStr()
{
char p[]="hello world!";
return p;
}
int main()
{
char *str;
str=returnStr();
printf("%sn",str);
}
问上述的输出是什么?
还有就是我把上述函数稍改一下
#include
char *returnStr()
{
char *p="hello world!";
return p;
}
int main()
{
char *str;
str=returnStr();
printf("%sn",str);
}
这个输出又是什么?各是什么原因呢
char p[]="hello world!";
p指向一个局部的数组地址,分配在栈中。
char *p="hello world!";
p指向一个字面常量。字面常量分配在哪里俺就不知道了。总之不会是局部的。
所以:
第一个指向的是个已被释放的内存,不会输出hello world!,要出错的吧
第二个输出的是: hello world!
1: 一切皆有可能
char[]为局部变量,returnStr结束后可能被覆盖
2: hello world!
"hello world!"是data segment的数据,不会改
第一种情况输出的应该是乱码,第二种情况输出的是hello world!。
前者char p[]这行的p是局部变量,由于是数组类型返回p后,p被销毁,所以就会输出乱码。
后者char *p这行的p虽然也是局部变量,但由于p是指针类型的,所以返回的p在赋予main里的str时会重新申请一块内存来存放数据,最后显示也就正常了。
可以用这段代码比较看一下:
#include
char r[]="1234567890";
char *s1()
{
char p[]="1234567890";
printf("--------------------n");
printf("in s1 p: %dn",r);
printf("--------------------n");
return r;
}
char *s2()
{
char *q="1234567890";
printf("--------------------n");
printf("in s2 q: %dn",q);
printf("--------------------n");
return q;
}
int main()
{
char *t1,*t2;
t1=s1();
t2=s2();
printf("--------------------n");
printf("in mainn");
printf("p: %d, q: %dn",t1,t2);
printf("--------------------n");
printf("%sn",t1);
printf("%sn",t2);
}
不好意思楼上r的地方没有改回来,应该是下面的:
#include
char *s1()
{
char p[]="1234567890";
printf("--------------------n");
printf("in s1 p: %dn",p);
printf("--------------------n");
return p;
}
char *s2()
{
char *q="1234567890";
printf("--------------------n");
printf("in s2 q: %dn",q);
printf("--------------------n");
return q;
}
int main()
{
char *t1,*t2;
t1=s1();
t2=s2();
printf("--------------------n");
printf("in mainn");
printf("p: %d, q: %dn",t1,t2);
printf("--------------------n");
printf("%sn",t1);
printf("%sn",t2);
}
这个问题在林锐的高质量C++/C编程指南上有,内容如下:
http://www.cnns.net/ref/cppguide.htm
所以回答是:
1、报错。p是局部变量,保存在栈里,函数结束后p已经销毁,成为wild pointer。
2、hello world!因为p是一个指向字符串常量的指针,字符串常量保存在.data(已定义的全局变量)里,函数返回时那个指针地址还是有效的。
当然,你如果想查看一下,上面的两个程序指针指向不同的地方,你可以打印出指针的地址。
printf("%p",p);还有,你如果想直接打印出字符串常量所存放的地址,你可以用这个
printf("%p","Hello world!");想知道为什么吗?c primer里面有,因为"Hello world!"就可以表示指向这个字符串常量的指针了!
关于char p[] = “Hello world!”的讨论,已经很正确了。
那么现在我们来讨论 char *p = “Hello world!”的问题。
Char * fun()
{
char *p = “Hello world!”
return p;
}
Main ()
{
Char * p = NULL;
P = fun();
Cout<< p;
Cout<}
我们发现其可以完全打印出hello world,并且打印其地址,并且不会有任何问题。到底是什么原因哪?
我们在main中在重新定义一个char变量*p1
*p1 = fun();
打印出*p1的值和地址,我们惊奇的发现p1和p的地址相同。不幸的是我们定义*p2=fun(),其打印出的地址和前两次也相同。所以说“返回的p在赋予main里的p时会重新申请一块内存来存放数据,最后显示也就正常了”是不正确的,如果是这样应该其内存是不相同的。但是这好像还是不能完全说明问题,问题是“hello world”数据到底放在哪里了那?
我们知道程序内存主要分三部分:静态存储区,堆,栈,那么到底放在那个上面了那?
我们在定义一个函数
Char * fun2()
{
char *p = “Hello world!”
return p;
}
此时和在main调用fun()一样,分别定义*p,*p1,*p2,分别调用fun2();打印其结果和地址,你会吃惊的发现此时的地址居然和调用fun()函数的地址完全相同,我没有吓唬你。是真的完全一样。至此我们可以明白一点原来fun()和fun2()中的地址完全相同,也就是说他们共同应用的是一块地址,能够在整个程序运行过程中共同占有一块地址的。肯定放在静态存储区上,至此问题明了。
Char *p = “Hello World!”数据放在静态存储区上,为了我们说明问题,我们在多做几个实验。
我们定义全局变量char *p1= “Hello World!”,那么这次我们分别调用不同的指针指向fun(),fun2(),全局*p,在打印其地址。看到地址我们有吃惊,居然地址又是完全相同,到底怎么回事?
原因很简单,我们在定义这些变量的时候,编译器会根据我们定义的值在静态存储区开辟地址,保存内容,简单的把地址返回给不同的地址指针而已。如果你还是不相信,你可以把全局变量*p1的值更改为其他字符串,你会发现*p1的地址和fun(),fun2()的地址是相邻的。我们知道全局变量肯定放在静态存储区,所以现在我们更加肯发定fun,fun2内的char *p= “Hello World!”数据放在静态存储区。
现在完了,没有。
我们在main中定义*p,指向fun();
即
Char *p = null;//良好的习惯
p= fun();
p[0] = ‘U’;//我的意图很明显就是想变成“Uello World!”
编译通过,高兴。
运行出错,追踪,p[0] = ‘U’;在这句出错,运行错误说明不能更改p[0]的值。哦,至此我们明白了,原来编译器是这样给我们作的
const char temp[] = “Hello World!”;
char *p1 = temp;
为了验证编译器是否这样做我们定义
全局变量
char pp[] = “Hello World!”;
在main中调用char *p = pp;
p[0] = ‘U’;
打印p,终于按我们的要求打印出 Uello World!
再看看p1和pp的地址,发现不相同,但是地址相邻。为什么?
const对象和非const对象内容当然不相同了!
至此我们总结如下:
我们在函数,全局内定义的char *p = “Hello World!”;编译器都会为我们作为全局变量定义。伪代码如下
const char temp[] = “Hello World!”;
char *p1 = temp;
任何调用“Hello World!”只是返回temp的一个const指针。
这几天笔试经常出现的笔试题
silver6 | 02 十一月, 2005 09:19
1.win2k,vc++6下,指出下面定义的含义和所占的字节数:
int a;
int a[];
int *a;
int *a[];
int (*a)[];
int (*a)();
int *a();
int **a;
2. array和list的区别
3. 列举出几种进程调度方法,并说出区别
4.定义的解释,int *p, int (*p)();
5.结实数据类型定义:int(*f[10])(int)
int a; 4
int a[]; 数组未知大小
int *a; 4
int *a[]; 数组未知大小
int (*a)[];4
int (*a)();4
int *a(); 返回int*的函数,未知大小
int **a;4
5.int(*f[10])(int):
f是一个10个元素的数组,每个元素为int(*)(int)类型的函数指针
4.定义的解释,int *p, int (*p)();
答: int *p 定义了一个指针
int (*p)(); 定义一个指向函数的指针
5.结实数据类型定义:int(*f[10])(int)
答:
这里定义了一个指向函数的指针数组
比如:
int f1(int);
int f2(int);
.....
f[1] = f1;
f[2] = f2;
f[1](); //调用
这些问题要看书,然后多碰一些实际的问题。
呵呵,因为我没有用 cc++ 做过项目,这些基本的东西容易忘记
int a; // 定义一个整型变量
int a[]; // 定义一个整型数组,在 c 中 数组名其实等同于一个指针常量
int *a; // 定义一个整型指针变量
int *a[]; // 定义一个整型指针数组, 理解为: int* a[];
int (*a)[]; // 定义一个指向整型数组的指针
int (*a)(); // 定义一个指向返回值为整型的函数的指针
int *a(); // 声明一个返回整型指针的函数
int **a; // 定义指向整型指针变量的指针, 等同于 int *a[];
这样的问题一定要在实际问题中多碰碰,然后理解就容易记得牢靠
华为笔试题 关于全局变量
silver6 | 02 十一月, 2005 09:17
A.整个程序中是唯一的。
B.在编译连接的时候它的地址就是确定的。(题目记得不全)
有谁碰过类似的题目?帮忙看一下。
有点困惑就是:如果程序包括多个进程的话,那么各个进程中的全局变量可不可以同名?
全局变量的定义是这样的吧:全局变量也称为外部变量,它是在函数外部定义的变量。 它不属于哪一个函数,它属于一个源程序文件。其作用域是整个源程序。在函数中使用全局变量,一般应作全局变量说明。 只有在函数内经过说明的全局变量才能使用。全局变量的说明符为extern。 但在一个函数之前定义的全局变量,在该函数内使用可不再加以说明
从定义来看应该是唯一的吧!
不知道大家是怎么看的!
A.整个程序中是唯一的。
B.在编译连接的时候它的地址就是确定的。
肯定是A啊,关于地址我想要到执行时才能够确定吧。
B.在编译连接的时候它的地址就是确定的
我认为这是正确的,因为全局变量和static变量都是存放在静态数据区,其在编译时期就确定了.
多进程中,全局变量名称是完全一样的,名称、值都是一样的。
多进程就是一个进程的多份拷贝。
我认为B
对于A, static全局变量是可以有多个的。
不过“全局”有点模糊,是生存期全局还是作用域全局。作用域全局的肯定只有一个。
static的生存期是全局的,但作用域是局部的(文件或者函数)
B,全局变量(无论static与否)其地址都是在连接时候确定的。
进程有自己的内存空间.
线程是共享内存的.
一个全局变量应该只能作用与进程.
进程间通讯没有听说有用全局变量的.但是线程可以用全局变量做锁.
今天遇到的面试题目
silver6 | 01 十一月, 2005 13:41
1.有以下表达式:
int a=248; b=4;int const c=21;const int *d=&a;
int *const e=&b;int const *f const =&a;
请问下列表达式哪些会被编译器禁止?为什么?
*c=32;d=&b;*d=43;e=34;e=&a;f=0x321f;
2.交换两个变量的值,不使用第三个变量。即a=3,b=5,交换之后a=5,b=3;
3.c和c++中的struct有什么不同?
4.#include
#include
void getmemory(char *p)
{
p=(char *) malloc(100);
strcpy(p,"hello world")
}
int main( )
{
char *str=NULL;
getmemory(str);
print("%s/n",str);
free(str);
return 0;
}
程序运行的结果是什么?为什么?
5.char szstr[10];
strcpy(szstr,"0123456789");
产生什么结果?为什么?
6.列举几种进程的同步机制,并比较其优缺点。
7.进程之间数据交换的途径
8.类的静态成员和非静态成员有何区别?
9.纯虚函数如何定义?使用时应注意什么?
10.数组和链表的区别
11.写一个函数比较两个字符串str1和str2的大小,若相等返回0,若str1大于
str2返回1,若str1小于str2返回-1
12.ISO的七层模型是什么?tcp/udp是属于哪一层?tcp/udp有何优缺点?
2, 3, 4都是老题
2题 有两种解法, 一种用算术算法, 一种用^(异或)
3题 主要区别是默认的存取权限不同
4题 由于函数参数是传值的, 所以返回主函数后str还是NULL
5题 由于定义的字符串长度小于拷贝的字符串长度, 会造成非法操作
11题主要是字典序比较
12题只要学过网络的都应该会做
第2题:
a = a + b;
b = a - b;
a = a - b;
or
a = a^b;// 只能对int,char..
b = a^b;
a = a^b;
1.有以下表达式:
int a=248; b=4;int const c=21;const int *d=&a;
int *const e=&b;int
请问下列表达式哪些会被编译器禁止?为什么?
*c=32;d=&b;*d=43;e=34;e=&a;f=0x321f;
----------
*c 这是个什么东东,禁止
*d 说了是const, 禁止
e = &a 说了是const 禁止
const *f const =&a; //禁止
2.交换两个变量的值,不使用第三个变量。即a=3,b=5,交换之后a=5,b=3;
a =a^b;
b =b^a;
a=a^b;
3
3.c和c++中的struct有什么不同?
不想再说了,
5.char szstr[10];
strcpy(szstr,"0123456789");
长度不一样,会造成非法的OS
12.ISO的七层模型是什么?tcp/udp是属于哪一层?tcp/udp有何优缺点?
应用层
会话层
表示层
运输层
网络层
物理链路层
物理层
tcp /udp属于运输层
TCP 服务提供了数据流传输、可靠性、有效流控制、全双工操作和多路复用技术等。
与 TCP 不同, UDP 并不提供对 IP 协议的可靠机制、流控制以及错误恢复功能等。由于 UDP 比较简单, UDP 头包含很少的字节,比 TCP 负载消耗少。
7.进程之间数据交换的途径
共享段
内存映射文件
剪切板
socket
mailslot
管道
文件(这个不知道算不算)
c和c++中struct的主要区别是c中的struct不可以含有成员函数,而c++中的struct可以。c++中struct和class的主要区别在于默认的存取权限不同,struct默认为public,而cl
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/122100/viewspace-654/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/122100/viewspace-654/