两道面试题!

wbgxx 2010-04-04 01:03:55
What will print out? 
main()
{
char *p1=“name”;
char *p2;
p2=(char*)malloc(20);
memset (p2, 0, 20);
while(*p2++ = *p1++);
printf(“%s\n”,p2);
}
Answer:empty string.
What will be printed as the result of the operation below:
main()
{
int x=20,y=35;
x=y++ + x++;
y= ++y + ++x;
printf(“%d%dn”,x,y);
}
Answer : 5794
...全文
250 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
yyc23 2010-04-04
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 sunny_chenpeng 的回复:]
引用楼主 wbgxx 的回复:
C/C++ code
What will print out?
main()
{
char *p1=“name”;
char *p2;
p2=(char*)malloc(20);
memset (p2, 0, 20);
while(*p2++ = *p1++);
printf(“%s\n”,p2);
}
Answer:empty string……
[/Quote]

第一题解释正确。
第二题我认为一般而言不去考虑编译环境的话答案也是正确的。出题者考察的目的仅仅是先++和后++的区别。
hellodota121 2010-04-04
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 mstlq 的回复:]
引用 13 楼 e_xyl 的回复:
引用 12 楼 etoux 的回复:
引用 7 楼 jbz001 的回复:
靠~!
第一题的while循环后面有个分号
写在那里明摆着忽悠人啊
一不小心就没看见。

这个循环语句很有名的,复制字符串,strcpy用的就是这个语句


这位大哥你开什么玩笑,复制字符串就用这个循环啊,p1和p2的指向都变了,你怎么找到字符串的头啊


……
[/Quote]
还有哪条啊?感觉找不到字符串头。
mstlq 2010-04-04
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 e_xyl 的回复:]
引用 12 楼 etoux 的回复:
引用 7 楼 jbz001 的回复:
靠~!
第一题的while循环后面有个分号
写在那里明摆着忽悠人啊
一不小心就没看见。

这个循环语句很有名的,复制字符串,strcpy用的就是这个语句


这位大哥你开什么玩笑,复制字符串就用这个循环啊,p1和p2的指向都变了,你怎么找到字符串的头啊
[/Quote]

人家没开玩笑……
复制字符串是用这种方式,但没说仅仅就靠这么一条语句……
scudc 2010-04-04
  • 打赏
  • 举报
回复
学习了。。。。。
scudc 2010-04-04
  • 打赏
  • 举报
回复
但为什么打印出来的还是20个字符?p2移动了五个字符啊。。。
tianya0609 2010-04-04
  • 打赏
  • 举报
回复
第一题就考细心不了
scudc 2010-04-04
  • 打赏
  • 举报
回复
知道了,循环后p2的向改变了
scudc 2010-04-04
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
int main()
{
char *p1="name";
char *p2;
p2=(char*)malloc(20);
memset (p2, 1, 20);
while(*p2++ = *p1++);
printf("%s\n",p2);
return 0;
}

改成memset (p2, 1, 20)后vc6.0中打印出A
starboy520 2010-04-04
  • 打赏
  • 举报
回复
学习。。。。。。
bullbat 2010-04-04
  • 打赏
  • 举报
回复
感觉答案是这样的。。
e_xyl 2010-04-04
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 etoux 的回复:]
引用 7 楼 jbz001 的回复:
靠~!
第一题的while循环后面有个分号
写在那里明摆着忽悠人啊
一不小心就没看见。

这个循环语句很有名的,复制字符串,strcpy用的就是这个语句
[/Quote]

这位大哥你开什么玩笑,复制字符串就用这个循环啊,p1和p2的指向都变了,你怎么找到字符串的头啊
eTouX 2010-04-04
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 jbz001 的回复:]
靠~!
第一题的while循环后面有个分号
写在那里明摆着忽悠人啊
一不小心就没看见。
[/Quote]
这个循环语句很有名的,复制字符串,strcpy用的就是这个语句
eTouX 2010-04-04
  • 打赏
  • 举报
回复
第一题:p指向了hello后后面一个NULL了,所以空字符串
第二个,感觉这么写东西的人脑子有问题。我不知道是不是所有编译器都能得到这个答案,gcc是这个答案
e_xyl 2010-04-04
  • 打赏
  • 举报
回复
引用c#版的一个贴子:作者为due(Copy卡卡西)

如果x++,++x是以单独表达式(独占一行)出现的,
x++;
++x;
那么它们的作用就是相同的,等同于x = x + 1;
------------------------------------------------
但当他们用于表达式内部,就有区别了。
要明白,x++表示先取x值去计算,然后在将x+1;
++x,先x+1,然后取x值去计算。
-----------------------------------------------------------------------------

+ 运算符的优先级高于 = 运算符
+ 的两边的运算顺序是从左到右

这个问题的关键就是运算符的执行顺序和优先级的问题。

以下 "=" 代表 =运算符,
"+" 代表 +运算符.

====================================================================================
首先看:int x = 3
x += x++;

1.x += x++ 等同于 x = x + x++;

2.在这个表达式中 = 的优先级低,先计算 x + x++

3a.先计算"+"左边的x,为3;"+"右边的,由于是x++,先用x的初值参加"="右边表达式计算,则也
为3. 那么现在"="右边变成了 3 + 3; 运算结果 6;

(注意:"="左边的 x ,在右边的计算过程中,现在它的值为 3,但此时,记住还没有运行"=")

3b.x++ 通过初值参加表达式计算后,它产生增量;

(注意:"=" 左边的 x, 由于 x++ 产生的增量,它的值变化了,也就是 4。 记住还没有运
行"=",所以这不是最终结果)

4.在第3步骤中"="右边的表达式都计算完毕了,所以运行 "=".
此时将右边表达式的值 6 赋给 "=" 左边的表达式 x;

5. x 最终值为 6.
====================================================================================
OK,我们再看:
int x = 3
x = x++ + x;(注意与上例的区别)

1.在这个表达式中 "=" 的优先级低,先计算 x++ + x

2a.先计算"+"左边的x++,由于是x++,先用初值参加"="表达式的运算,为 3;
2b.x++通过初值参加运算后产生增量, 即: x 的值为 4.

(注意:"+"右边的 x , 由于x++产生的增量, 现在它的值为 4;
"="左边的 x, 由于x++产生的增量,现在它的值也为4;但是"="还没有运行,所以
现在不是最终结果)

3.接着计算"+"右边的表达式 x; x由于上面步骤 2b,所以它的值为 4;

4.“=”右边表达式计算完毕,为 3 + 4, 值为 7;

5.现在运行"=",将它右边的运行结果赋给它左边的x, 所以 x 的值为 7;

***********************************************************************************
上面两个例子,那些1,2,3......是运行的步骤,直到最后才是最终结果,我想你不明白的原因是在执行过程中被x++所迷惑,而总是“着急”想得到最终结果。所以才想不通。其实那时候"="
左边的x的值虽然会“临时”的变化的,但是那不是最终结果。等级最低的运算符运行完毕才是最终结果,在这里"="优先级最低
************************************************************************************
好,现在回到你的例子
int x = 0;
x = x++;

1.先计算x++,没问题,x先是通过初值参加"="右边表达式的计算,那么"="右边表达式的值为0;
同时x++产生增量,"="号左边的 x 这时“临时”为 1;

2."="号右边的表达式计算完毕,根据步骤1的计算结果,值为 0;

3.运行"=",将它右边表达式的值赋给左边的 x, 那么 x就等于 0 了。
所以在循环中,不论循环多少次x 都等于0。
===================================================================================
引申的问题
int x = 0;
x=++x;
第一次循环:
1.先计算++x,没问题,由于是++x,那么 ++x首先产生增量参加"="右边表达式的计算,即值为
1,"="左边的 x 这时“临时”值为1;

2."="号右边的表达式计算完毕,根据步骤1的计算结果,值为 1;

3.运行"=",将它右边表达式的值赋给左边的 x, 那么 x就等于 1 了。

第二次循环
1.先计算++x,没问题,由于是++x,那么 ++x首先产生增量参加"="右边表达式的计算,即值为
2,"="左边的 x 这时“临时”值为2;

2."="号右边的表达式计算完毕,根据步骤1的计算结果,值为 2;

3.运行"=",将它右边表达式的值赋给左边的 x, 那么 x就等于 2 了。

所以 x=++x 参加循环,是可以递增的。
maildaty 2010-04-04
  • 打赏
  • 举报
回复

#include<stdio.h>
main()
{
int x = 20, y = 35;
x = y++ + x++;
y = ++y + ++x;
printf("%d %dn", x, y);
}
这个程序是这样运行的:
x = y++ + x++;首先是x=20与y=35相加后x=55,并且x y都要自加 所以x=56,y=36

y = ++y + ++x;首先是x y都自加,x=57,y=37,然后x+y得y=94

这个题没有问题
huanmie_09 2010-04-04
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 mstlq 的回复:]
引用 4 楼 huanmie_09 的回复:
第一题,while循环赋值完之后p2的指针指向'\0',因此为空;
第二题,
int x=20,y=35;
x=y++ + x++;
y= ++y + ++x;
分解为:
x = y + x;
y++;
x++;
++y;
++x;
y = y + x;

第一题的解释很正确^_^
不过第二题解释有点不确切了,准确地说,第……
[/Quote]
关于后自加和后自减,书上只提到了一个顺序点的概念,具体情况依赖于编译器的实现。
这里确实比较含糊。自己写程序尽量避免吧。
jbz001 2010-04-04
  • 打赏
  • 举报
回复
靠~!
第一题的while循环后面有个分号
写在那里明摆着忽悠人啊
一不小心就没看见。
mstlq 2010-04-04
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 huanmie_09 的回复:]
第一题,while循环赋值完之后p2的指针指向'\0',因此为空;
第二题,
int x=20,y=35;
x=y++ + x++;
y= ++y + ++x;
分解为:
x = y + x;
y++;
x++;
++y;
++x;
y = y + x;
[/Quote]
第一题的解释很正确^_^
不过第二题解释有点不确切了,准确地说,第二题的赋值会引发未定义行为,是跟具体编译有关的……
那里的答案也只是一种可能的情况而已,这题出得太烂。。。。

其实就是最简单的
int x=1;
x=x++;
printf("%d",x);
结果可能是2(大多数情况下)也可能是1,这个标准是没规定的……
sunnypchen 2010-04-04
  • 打赏
  • 举报
回复
[Quote=引用楼主 wbgxx 的回复:]
C/C++ code
What will print out?
main()
{
char *p1=“name”;
char *p2;
p2=(char*)malloc(20);
memset (p2, 0, 20);
while(*p2++ = *p1++);
printf(“%s\n”,p2);
}
Answer:empty string.
Wha……
[/Quote]

这样对了呀
huanmie_09 2010-04-04
  • 打赏
  • 举报
回复
第一题,while循环赋值完之后p2的指针指向'\0',因此为空;
第二题,
int x=20,y=35;
x=y++ + x++;
y= ++y + ++x;
分解为:
x = y + x;
y++;
x++;
++y;
++x;
y = y + x;
加载更多回复(3)

70,032

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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