从文法上讲,这个程序是没有问题的(虽然优秀的程序员不会这样做)。但是运行结果却是未知的。这主要取决于你的编译器。
如果编译器将字符串A、B放在连续的空间中,即“ABCD”,则应该得到结果“ABCD”和“FGH”,因为s2++是先加1,后使用,因此赋值语句把字符'F'拷贝到'E'位置。不过因为字符串“ABCD”后面暗含了一个终结字符'\0',所以ps1表示的字符串只能是“ABCD”。我解释不了为什么会出现“ABCDEFGH”。
如果两个字符串并不连续,则结果不可知。当然,楼上说的也没有错误。我使用VC运行,结果出错。
我想这个程序只能适于“考试”或者“展示技巧”,没有什么实际价值。不过第一个while经常用于计算字符串的长度。还是值得借鉴的。
这是一个for语句,根据for语句的形式:for(语句1;语句2;语句3){函数体;}
的执行顺序是:语句1,判断语句2是否成立(非0为真,0为假)函数体,最后是语句3,(£)再进行判断语句2,是否成立,在执行函数体,语句3
,在执行(£)知道条件不满足语句2,跳出循环;如果,语句2是非逻辑表达式,即非判断语句时,循环体内,必有满足条件的跳出语句
break,否则为死循环;
这里的
for(k=1;k+1;k++)
可以这样解释:执行循环for()语句时,初始条件
K=1;之后执行
K+1
(k=2,非0,条件为真继续执行)之后执行函数体for下面花括号{}的内容,之后在执行
K++(K自增1)
所以,明白for()语句的执行顺序就可以明白了,明白了吗?
你的程序真能有运行结果吗,我真的表示怀疑呀。while中的条件怎么结束呢,请问,S1中的'\0'如果可以是0的意思还可以理解让循环结束,可惜不能。第二个WHILE中你用的是赋值=,如果如此的话,只有不停的循环出界还在一直继续。如果改成==,上面一个WHILE也改成*s1!='\0'的话,结果应该是预测答案,但你现在的程序会非法的。
我也运行了好几遍,实在发现不了什么问题.
无能为力啊!!
楼上说的好象有点问题,你说"赋值语句把字符'F'拷贝到'E'位置",
可是我把printf("%s\n%s\n",ps1,ps2)改成printf("%s\n%s\n",ps1,--ps2)后就得到了ABCDEFGH EFGH 啊.说明E没有被覆盖啊.
这个是很可怕的,因为你使用了不安全的内存。