int main()
{
char str1[] = "Overflow";
char str2[] = "Stack";
char *s1 = str1, *s2=str2;
while(*s1++ = *s2++)
printf("%s", str1);
return 0;
}
当这种情况破裂时
(while(*s1++ = *s2++))
解释逻辑
输出结果是
答案 0 :(得分:4)
*s1++
,在此变量中,*
的优先级高于++
。
在下面的代码中,
while(*s1++ = *s2++); //There should be a semicolon.Your code does not has.
*s1 = *s2
。*s1 = *s2
返回一个值,它是第一个字符,显然不是null。执行while()
循环。s1
和s2
会递增。s2
到达字符串末尾时,*s2
会返回分配给'\0'
的{{1}}。 s1
。现在,此表达式还返回*s1=*s2
和'\0'
循环终止的值。答案 1 :(得分:3)
这个while循环依赖于非零在C中的任何条件表达式中的计算结果为真。
从另一种方式开始,从更明显的方式进行操作,到这种速记,可能更清楚。
您可以从:
开始while(*s2 != '\0')
{
*s1 = *s2;
s1++;
s2++;
}
这意味着'当s2没有到达终结符时,继续将字符从s2复制到s1。每个副本后向前移动两个指针,为下一个副本做好准备。
但是,通过将增量操作包含在与副本相同的行中,可以缩短这一点。这是安全的,因为它是后增量操作。在副本完成之前,它不会评估。代码现在看起来像这样:
while(*s2 != '\0')
{
*s1++ = *s2++;
}
现在,鉴于非零等于真,我们可以进一步简化。 * s2!='\ 0'仅相当于* s2。
while(*s2)
{
*s1++ = *s2++;
}
最后,我们可以将副本本身移动到while语句中。 while语句本身会将字符从* s2复制到* s1,然后像以前一样评估* s1。然后增量发生,然后围绕它。所以我们的代码看起来像这样:
while(*s1++ = *s2++);
所以..在你的情况下,你的while语句后需要一个分号,否则会多次打印。
答案 2 :(得分:3)
*
运算符的优先级高于++
运算符,因为在您的表达式中
while(*s1++ = *s2++)
s1在增加之前首先由s2分配,因此评估顺序为
1。*s1=*s2;
2。s1++,s2++
3 printf("%s",str1)
,此处str1的值因操作1而改变
4.当循环达到结束'\0'
时,循环终止条件到来,由于上面指定的*s1=*s2
,该值被分配给s1,s1的值变为null => s1='\0'
和while循环终止
答案 3 :(得分:2)
此循环会将str2
的内容复制到str1
:
while(*s1++ = *s2++);
如果在str2中遇到最后一个字节(将为0),它会停止。
换句话说,str1[] = "Overflow"
将成为str1[] = "Stacklow"
。
更新:更详细的说明。
str2
中的一个字符,即S
。因此str1
Overflow
成为Sverflow
。Sterflow
。Starflow
。Stacflow
。Stacklow
。请注意,这些是屏幕截图中可见的行。
之后,遇到0字节并将其复制到str1
,因此它变为Stack\0ow
,但您不打印它。如果您要打印它,它将只打印Stack
。
答案 4 :(得分:0)
它会循环,直到遇到s2
中的字符串终止符('\ 0')while(*s1++ = *s2++)
printf("%s", str1);
while(*s1++='S') prints "Sverflow"
while(*s1++='t') prints "Sterflow"
while(*s1++='a') prints "Starflow"
while(*s1++='c') prints "Stacflow"
while(*s1++='k') prints "Stacklow"
while(*s1++='\0') ends loop