C语言指针(while(*s1++ = *s2++))



对于下面的程序

#include<stdio.h>
int main()
{
    char str1[] = "India";
    char str2[] = "BIX";
    char *s1 = str1, *s2=str2;
    while(*s1++ = *s2++)
        printf("%s", str1);
    printf("n");
    return 0;
}

while循环中的条件是如何计算的?我可以在stack overflow中看到类似的帖子,但是他们没有解释为什么*操作符比后缀操作符具有更高的优先级。但实际上,后缀操作符比*(解引用)操作符具有更高的优先级。这里引用的优先级表

请解释输出

下面的代码是如何打印的
BndiaBIdiaBIXia 

操作符的优先级和执行顺序不一定相同。

*s1++ = *s2++

由编译器按如下方式求值:

  1. 编译器看到具有最高优先级的"++"。因为它是自增后操作符,它只是注意到在表达式求值完成后需要对指针进行自增的事实。
  2. 编译器看到"*"操作符,告诉它应该取消对s2的引用,并将其作为RHS
  3. 赋值左侧相同,s1处的char被设置为s2处的char的值
  4. 编译器回到它的注意,指针需要在表达式求值后递增,并这样做。

即使++的优先级高于*,它仍然是最后做的。这里的优先级只是指必须对指针进行后增量操作,而不是对

指针处的值进行后增量操作。

条件内的赋值加上%s格式字符串解释了这一点:

拆分条件

c2 = s2;
c1 = s1;
condition = *c1 = *s2;
++s1, ++s2;

因此,条件求值为指针s2是否不指向空字符。

对于BIX都是如此。第三次迭代时,s2将位于字符串字面值BIX的空终止符处。

对于每次迭代,打印str1的内容。对于第一次运行,第一个字符已经被BIX中的B覆盖。对于第二次运行,第二个字符已被I覆盖。对于最后一次运行,您将获得BIXia。如果您附加一个换行符,这将更清楚:printf("%sn", str1);将在单独的行上打印每个迭代。

注意:你可能混淆了===,你实际上是在寻找不匹配的;这是一个很常见的错误。

while(*s1++ == *s2++) {...}

如果我没记错的话,你必须写

while(*s1++ == *s2++)
    printf("%s",str1);

否则你只是替换而不是比较str1[i]与str2[i]。

一元星号'*'操作符具有从右到左的关联,而不像后缀自增'++'操作符那样具有从左到右的关联。因此,在本例中首先计算一元星号。这与LALR解析器的工作方式有关。

见http://www.swansontec.com/sopc.html

相关内容

最新更新