面试题

fujingn188 2005-07-12 06:50:20
1.char * p1,int * p2,long * p3,(void*)p1=(void*)p2=(void*)p3=(void*)4求p1++,p2++,p3++?
2.宏定义的函数跟一般函数有什么异同,写出两个宏定义容易出错的地方?
3.C语言中未分配地址的指针32位指针的值是多少?
4.float x,y x=y=123,则(x==y)的值是多少?
5.把S2中的字符接到S1后面
void strcat(char * s1,char * s2)
{
while(*s1!='\0')
______________;
for(;___;s1++,s2++)
}
...全文
643 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaojun789 2005-07-30
  • 打赏
  • 举报
回复
mark
bestvanguard 2005-07-29
  • 打赏
  • 举报
回复
留名
antijpn 2005-07-29
  • 打赏
  • 举报
回复
和作业没两样……

转新手乐园
cy2005abc 2005-07-14
  • 打赏
  • 举报
回复
void strcat(char * s1,char * s2)
{
while(*s1!='\0')
s1++;
______________;
(*s1=*s2)
for(;___ ; s1++,s2++);
}
Willpro 2005-07-14
  • 打赏
  • 举报
回复
www.mark.com
kernelxu 2005-07-14
  • 打赏
  • 举报
回复
其实*s1=*s2和(*s1=*s2)!='\0'是一样的,反而觉得(*s1=*s2)!='\0'更清晰明了,风格更好。
谢谢nuaa3(alan)、 myhouwei(myhouwei)指出错误,对zhulianggen(宁无)表示歉意!
对于第3题还有话要说:
我在WIN2000+VC6.0环境下运行一下代码:
/***********************************************
*file name : float_accuracy.c
*description : x是float类型,什么情况下x!=x为真
*note : 若在判断x!=x前对x进行了修改,则
有可能使x!=x为真
*author : kernelxu
*resource : http://bbs.chinaunix.net/forum/
viewtopic.php?t=575049&show_type=
*date : 2005/07/10
***********************************************/

#include <stdio.h>

/**********************************************
*function name : main()
***********************************************/
int main(void)
{
float x = (float)1e-3;

x = x + 1;
//printf("HELLO WORLD!\n");
if (x != x)
{
printf("x is UNequal to x!!\n");
}
else
{
printf("x is equal to x!\n");
}

return 0;
}/*END OF main()*/
运行结果是:
x is UNequal to x!!
加上被注释的那一条后,结果为:
x is equal to x!

怀疑是VC6.0的BUG。
具体大家可看看:
http://bbs.chinaunix.net/forum/viewtopic.php?t=575049&show_type=
hj008 2005-07-14
  • 打赏
  • 举报
回复
float 好象最好不要象上面的那样比吧.
whatsouta 2005-07-14
  • 打赏
  • 举报
回复
所有答5 8 8 的,要答
4+sizeof(char)
4+sizeof(int)
4+sizeof(long)
myhouwei 2005-07-13
  • 打赏
  • 举报
回复
1.char * p1,int * p2,long * p3,(void*)p1=(void*)p2=(void*)p3=(void*)4求p1++,p2++,p3++?

5 8 8

s1++
(*s1=*s2)!='\0'
加了小括号了,就先做付值,再判断,所以当测试为'\0'时,\0已经付给S1了,所以它是完整的字符串,可以进行字符串操作
迷你苑 2005-07-13
  • 打赏
  • 举报
回复
第一题
指针的运算,指针的加减是和他的类型有关的,即:
设有T *型的指针p,
则p++(也就是p+1)就等于 p + sizeof(T)
但是本题后面的(void*)p1=(void*)p2=(void*)p3=(void*)4
VC++7.0下编译错误
一个指针变量所指向的类型定义后是不能改的,
而void*只是代表指向一块内存,具体什么类型
看你怎么转换,但是若
void* p1 ="111";
p1++;
提示:“void *” : 未知的大小
所以void*不能进行指针运算
他的内容具体含义看转换
char * c= (char *)p1;
那就是字符
int * i= (int *)p1;
那就是整型
第二题
2.宏定义的函数跟一般函数有什么异同,写出两个宏定义容易出错的地方?
宏只是简单代替,所以会很危险
第三题
只知道MicroSoft的VC++下是0xcccccccc
第四题
4.float x,y x=y=123,则(x==y)的值是多少?
我测试是true
虽然是浮点数,但编译时,x,y内存中的内容是一样的
第五题
5.把S2中的字符接到S1后面
void strcat(char * s1,char * s2)
{
while(*s1!='\0')
______________;
for(;___;s1++,s2++)
}
s1++
我个人认为这个比较好,我在vc++7.0下测试了正常
(*s1 = *s2) != '\0'


望高手指点!!!!!!!!!!!!!!!!1
nuaa3 2005-07-13
  • 打赏
  • 举报
回复
我不同意你说的 (*s1=*s2)!='\0' 与 *s1=*s2 都是可以的。 *s1=*s2 只不过隐藏了 判断里面。
===========
kernelxu() ( ) 信誉:100 说道:
zhulianggen(宁无) 填的第5个程序是错误的!
应该是
s1++
*s1=*s2
而不是
s1++
(*s1=*s2)!='\0'
因为如果在后加了!='\0'后会使得s1中存储的一系列字符没了'\0'作为结束符,以后就不能对s1进行
字符串的操作了。
第1题中
char * p1,int * p2,long * p3,(void*)p1=(void*)p2=(void*)p3=(void*)4
4这个常量地址即是p1、p2、p3所指向的地址。
(void*)p1=(void*)p2=(void*)p3=(void*)4在求p1++,p2++,p3++之前操作,相当于对各指针赋了初值
基本同意二楼的。
只是第3题不太确定,在VC6.0中好像是0Xcccccccc,其他不知道,请高人告知。
忆中人2019 2005-07-13
  • 打赏
  • 举报
回复
好贴!
llf_hust 2005-07-13
  • 打赏
  • 举报
回复
#include <iostream>
using namespace std;

void strcat(char *str1,char *str2)
{
while(*str1!='\0')
str1++;
for(;(*str1=*str2)!='\0';str1++,str2++);
}

int main ()
{
char str1[]="abc",str2[]="def";
strcat(str1,str2);
cout<<str1<<" "<<str2<<endl;
return 0;
}
kernelxu 2005-07-13
  • 打赏
  • 举报
回复
zhulianggen(宁无) 填的第5个程序是错误的!
应该是
s1++
*s1=*s2
而不是
s1++
(*s1=*s2)!='\0'
因为如果在后加了!='\0'后会使得s1中存储的一系列字符没了'\0'作为结束符,以后就不能对s1进行
字符串的操作了。
第1题中
char * p1,int * p2,long * p3,(void*)p1=(void*)p2=(void*)p3=(void*)4
4这个常量地址即是p1、p2、p3所指向的地址。
(void*)p1=(void*)p2=(void*)p3=(void*)4在求p1++,p2++,p3++之前操作,相当于对各指针赋了初值
基本同意二楼的。
只是第3题不太确定,在VC6.0中好像是0Xcccccccc,其他不知道,请高人告知。

yesiloveyou 2005-07-13
  • 打赏
  • 举报
回复
为什么我把上面zhulianggen(宁无) 填的程序写了下,会出错?大吓们帮我看看哪里写错了?
#include <iostream>
using namespace std;

void strcat(char *str1,char *str2)
{
while(*str1!='\0')
str1++;
for(;(*str1=*str2)!='\0';str1++,str2++);
}

int main ()
{
char *str1,*str2;
str1="abc";
str2="def";
strcat(str1,str2);
cout<<str1<<" "<<str2<<endl;
return 0;
}
mxtah 2005-07-13
  • 打赏
  • 举报
回复
void strcat(char * s1,char * s2)
{
while(*s1!='\0')
______________;
for(;___;s1++,s2++)
}
=================================
我觉得最好把char* s1,char* s2改成:
char s1[],char s2[]
虽然两者是相等的,但是要主意的是在写main函数时,应该写成:
char s1[] = "abc";
char s2[] = "dee";
zhulianggen 2005-07-12
  • 打赏
  • 举报
回复
1.char * p1,int * p2,long * p3,(void*)p1=(void*)p2=(void*)p3=(void*)4求p1++,p2++,p3++?

p1,p2,p3的值是地址值,但是初始地值未知,怎么解答?
而且,p1++,p2++,p3++是否是顺序求解的?
也就是象如下语句:
p1++;
p2++;
p3++;
则,假设初始地址是p0
p1=p0+1,p2=p0+1+4,p3=p0+1+4+8

2.宏定义的函数跟一般函数有什么异同,写出两个宏定义容易出错的地方?

宏定义函数是立即解释的,无堆栈的,;一般函数有堆栈,在表达式的值的级上替换参数
易错1:
#define sqr(x) x*x /* 此时如果调用sqr(1+2)时变成1+2*1+2即5,不是预期的9
易错2:
#define sqr(x) x*x /* 此时若有变量x=1,则调用sqr(++x)时变成++x*++x即6,而不是预期的

3.C语言中未分配地址的指针32位指针的值是多少?

0xcccc

4.float x,y x=y=123,则(x==y)的值是多少?

float x,y x=y=123语句有问题,应该为
float x,y;
x=y=123;
再判断,如果这样则为true


5.把S2中的字符接到S1后面
void strcat(char * s1,char * s2)
{
while(*s1!='\0')
______________;
for(;___;s1++,s2++)
}

s1++
(*s1=*s2)!='\0'
leonatcs 2005-07-12
  • 打赏
  • 举报
回复
解释:
设有T *型的指针p,
则p++(也就是p+1)就等于 p + sizeof(T)
比如: char * p;
p++; //值就是p + sizeof(char)

surfer2888 2005-07-12
  • 打赏
  • 举报
回复
很简单阿,指针的计算会自动考虑指针的类型的,例如char是一位的,++则指针的地址指向加1
fujingn188 2005-07-12
  • 打赏
  • 举报
回复
第一题不懂谁能帮我解释下?
加载更多回复(3)

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧