下面C语言程序的输出结果是

main()
{ char *s,*s1="here is",*s2="key";
s=s1;
while(*s1!='\0') s1++;
while(*s1++=*s2++);
s2=s;
while (*s2!='\0') s2++;
printf("%d\n",s2-s);
}

s=s1; //s指向s1;
while(*s1!='\0') s1++; //*s1='\0'(其实这行毫无意义)
while(*s1++=*s2++); //s1,s2都指向的位置后移4位(其实这行毫无意义)
s2=s; //s2指向s
while (*s2!='\0') s2++; //s2指向'\0'
printf("%d\n",s2-s); //结果为7(就是"here is"的长度)

好吧,我错了,我去运行了一下,这个代码是错的,不能运行,
while(*s1++=*s2++); 这句是不能运行的,
s1和s2都是赋值到静态文本区(好像是这个名字)的,这里的值是不能改的,所以赋值是出错的。
如果是==,那么就是我之前说的答案了追问

这是书上的一道题。
*s1++,有效不?若有效,是先使用s1,做“*s1”引用,引用完后s1=s1+1?
当第二个while后,s1后移四位,即:原“here is”共七位+四位=11位;
s2指向s,即原“here is”的起始位置,而此时s1由于上面的11位而改变呢?
若后移溢出,那就为7位差。
不过调试时,不能运行。
可不知道此题用意是不是对“*s1++”的理解?

追答

s=s1; //s指向s1;
while(*s1!='\0') s1++; //*s1='\0'(其实这行毫无意义)
while(*s1++==*s2++); //s1,s2都指向的位置后移1位(==只移动一位,因为*s1!=*s2)
s2=s; //s2指向s
while (*s2!='\0') s2++; //s2指向'\0'
printf("%d\n",s2-s); //结果为7(就是"here is"的长度)

*s1++,有效不?若有效,是先使用s1,做“*s1”引用,引用完后s1=s1+1?
对的,先取*s1,然后s1=s1+1;
当第二个while后,s1后移四位,即:原“here is”共七位+四位=11位;
错,这个只是指针移动。原指针指向“here is”的h,现在后移一位指向e;
调试出错是因为 while(*s1++=*s2++); 这句题目应该是==,少了一个等号

温馨提示:答案为网友推荐,仅供参考
第1个回答  2014-06-25
输出结果是:9
然后程序溢出倒掉
第2个回答  2014-06-25
int main()
{
char *s, *s1 = "here is", *s2 = "key";
s = s1;
while (*s1 != '\0') s1++;
while (*s1++ = *s2++); // 未定义行为 (undefined behavior)
s2 = s;
while (*s2 != '\0') s2++;
printf("%d\n", s2 - s);
}

相似回答