指针条件while(* s1 ++ = * s2 ++)

时间:2013-11-15 07:03:23

标签: c pointers

int main()
{
char str1[] = "Overflow";
char str2[] = "Stack";
char *s1 = str1, *s2=str2;
while(*s1++ = *s2++)
printf("%s", str1);
return 0;
}

当这种情况破裂时

(while(*s1++ = *s2++))

解释逻辑

输出结果是

enter image description here

5 个答案:

答案 0 :(得分:4)

*s1++,在此变量中,*的优先级高于++。 在下面的代码中,

while(*s1++ = *s2++); //There should be a semicolon.Your code does not has.
    首先评估
  1. *s1 = *s2
  2. C中几乎每个表达式都返回一个值。所以*s1 = *s2返回一个值,它是第一个字符,显然不是null。执行while()循环。
  3. 然后s1s2会递增。
  4. 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
  • 第3次循环,变为Starflow
  • 第4次循环,变为Stacflow
  • 第5次循环,变为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