南梦宫光枪游戏:C语言问题

来源:百度文库 编辑:查人人中国名人网 时间:2024/04/28 01:58:14
先看一个程序:
main()
{ char *s1="ABCD",*s2="EFGH";
char *ps1=s1,*ps2=s2;
while(*s1)
s1++;
while(*s1++=*s2++);
printf("%s\n%s\n",ps1,ps2);
}
我预测的答案是:
ABCDEFGH
EFGH
但是运行结果是:
ABCDEFGH
FGH
我不知道为甚末,
帮忙解答一下
谢谢!

我也运行了好几遍,实在发现不了什么问题.
无能为力啊!!
楼上说的好象有点问题,你说"赋值语句把字符'F'拷贝到'E'位置",
可是我把printf("%s\n%s\n",ps1,ps2)改成printf("%s\n%s\n",ps1,--ps2)后就得到了ABCDEFGH EFGH 啊.说明E没有被覆盖啊.

你的程序真能有运行结果吗,我真的表示怀疑呀。while中的条件怎么结束呢,请问,S1中的'\0'如果可以是0的意思还可以理解让循环结束,可惜不能。第二个WHILE中你用的是赋值=,如果如此的话,只有不停的循环出界还在一直继续。如果改成==,上面一个WHILE也改成*s1!='\0'的话,结果应该是预测答案,但你现在的程序会非法的。

从文法上讲,这个程序是没有问题的(虽然优秀的程序员不会这样做)。但是运行结果却是未知的。这主要取决于你的编译器。
如果编译器将字符串A、B放在连续的空间中,即“ABCD”,则应该得到结果“ABCD”和“FGH”,因为s2++是先加1,后使用,因此赋值语句把字符'F'拷贝到'E'位置。不过因为字符串“ABCD”后面暗含了一个终结字符'\0',所以ps1表示的字符串只能是“ABCD”。我解释不了为什么会出现“ABCDEFGH”。
如果两个字符串并不连续,则结果不可知。当然,楼上说的也没有错误。我使用VC运行,结果出错。
我想这个程序只能适于“考试”或者“展示技巧”,没有什么实际价值。不过第一个while经常用于计算字符串的长度。还是值得借鉴的。

这个是很可怕的,因为你使用了不安全的内存。