我起了个新标题,只是不想再贴一次了,所以整个拷过来,
给大家参考一下,并无要引起大家注意的意思。 谢谢!
发信人: ReAKiNg (ReAKiNg), 信区: Office
标 题: Re: 几道面试题
发信站: 鼓浪听涛 (Fri Nov 16 17:19:03 2001), 转信
faint...还是把理由给了算了。
【 在 ReAKiNg (ReAKiNg) 的大作中提到: 】
: 有一点点难度。 我做了一份参考答案,理由暂时不忙给。
: 【 在 tsky (sky) 的大作中提到: 】
: : 发信站: 饮水思源 (2001年11月16日11:53:18 星期五), 转信
: : 1。int i=5,j;
: : j=(++i)*(i--);
: : 运行后i=_______,j=_________
: i == 5; j == 36;
我们知道++i先算++i在参与表达式运算,而i--恰好相反。
原式相当于(j=(++i)*i)&&(i--)
(j==6*6)&&(i==6-1)
: : 2。 int a[] = {0,1,2,3,4};
: : int *p[] = {a,a+1,a+2,a+3};
: : int **pp = p;
: : 假设a=8239150(记不清了,大概吧),p=8239168
: : *(pp++)-a = ?
: 2
第三行告诉我们pp = p;
所以pp++相当于p++;
而p++相当于p+1;相当于&p[1];
所以*(pp++)相当于*(&p[1]);相当于p[1];
p[1]等于多少? 等于a+1;
所以原式等价于(a+1)-a;
考虑到a和a+1是整形地址,占2字节的空间;
所以答案为2。
: : 3。int a[100],i,*p=a;
: : for(i=0;i<100;i++) a[i]=i;
: : for(i=0;i<100;i++)
: : {
: : *p=a[i];
: : g(&p);
: : };
: : for(i=0;i<100;i++)
: : {
: : printf("%d",a[i]);
: : };
: : void g(int **p);
: : {
: : **p++;
: : *p++;
: : }
: 991234567...99
: 即a[0]==99;a[i]=i; 其中1<=i<=99;
++优先级高于*,所以*p++相当于*(p++);
所以函数void g(int **p)的唯一作用是p自增(p++)两次;
不对实参指向的内容造成任何影响。
在main()函数的循环中,当i==99时,*p==a[0]==a[99]==99;
其他a[i]没有任何变化。
所以答案就是上面我说的。
: : 4。下面函数的作用:
: : fun(char *a,char *b)
: : {
: : while (*a++=*b++)
: : {};
: : return;
: : }
: 字符串拷贝函数。
这题简单的要命,不到2秒钟就知道是怎么回事了。
*a++相当于*(a++),所以原式相当于(*(a++))=(*(b++));
一个一个字符拷贝。
循环终止的条件是*a == '/0'即*b == '/0';
是字符串拷贝函数还不明显吗?
给大家参考一下,并无要引起大家注意的意思。 谢谢!
发信人: ReAKiNg (ReAKiNg), 信区: Office
标 题: Re: 几道面试题
发信站: 鼓浪听涛 (Fri Nov 16 17:19:03 2001), 转信
faint...还是把理由给了算了。
【 在 ReAKiNg (ReAKiNg) 的大作中提到: 】
: 有一点点难度。 我做了一份参考答案,理由暂时不忙给。
: 【 在 tsky (sky) 的大作中提到: 】
: : 发信站: 饮水思源 (2001年11月16日11:53:18 星期五), 转信
: : 1。int i=5,j;
: : j=(++i)*(i--);
: : 运行后i=_______,j=_________
: i == 5; j == 36;
我们知道++i先算++i在参与表达式运算,而i--恰好相反。
原式相当于(j=(++i)*i)&&(i--)
(j==6*6)&&(i==6-1)
: : 2。 int a[] = {0,1,2,3,4};
: : int *p[] = {a,a+1,a+2,a+3};
: : int **pp = p;
: : 假设a=8239150(记不清了,大概吧),p=8239168
: : *(pp++)-a = ?
: 2
第三行告诉我们pp = p;
所以pp++相当于p++;
而p++相当于p+1;相当于&p[1];
所以*(pp++)相当于*(&p[1]);相当于p[1];
p[1]等于多少? 等于a+1;
所以原式等价于(a+1)-a;
考虑到a和a+1是整形地址,占2字节的空间;
所以答案为2。
: : 3。int a[100],i,*p=a;
: : for(i=0;i<100;i++) a[i]=i;
: : for(i=0;i<100;i++)
: : {
: : *p=a[i];
: : g(&p);
: : };
: : for(i=0;i<100;i++)
: : {
: : printf("%d",a[i]);
: : };
: : void g(int **p);
: : {
: : **p++;
: : *p++;
: : }
: 991234567...99
: 即a[0]==99;a[i]=i; 其中1<=i<=99;
++优先级高于*,所以*p++相当于*(p++);
所以函数void g(int **p)的唯一作用是p自增(p++)两次;
不对实参指向的内容造成任何影响。
在main()函数的循环中,当i==99时,*p==a[0]==a[99]==99;
其他a[i]没有任何变化。
所以答案就是上面我说的。
: : 4。下面函数的作用:
: : fun(char *a,char *b)
: : {
: : while (*a++=*b++)
: : {};
: : return;
: : }
: 字符串拷贝函数。
这题简单的要命,不到2秒钟就知道是怎么回事了。
*a++相当于*(a++),所以原式相当于(*(a++))=(*(b++));
一个一个字符拷贝。
循环终止的条件是*a == '/0'即*b == '/0';
是字符串拷贝函数还不明显吗?