C 中的指针 (while(*s1++ = *s2++))

Pointer in 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 循环中的条件如何计算?我可以在堆栈溢出 here, but they didn't give explanation how * operator has greater precedence than postfix operator.But actually, postfix operator has greater precedence than * (Derefernce) operator. Precedence table for our reference here

中看到类似的 post

请解释此代码如何在输出下方打印

BndiaBIdiaBIXia 

如果我没误会你,你必须写

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

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

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

拆分条件

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

所以条件判断指针s2是否没有指向空字符

BIX 就是这种情况。第三次迭代 s2 将位于字符串文字 BIX.

的空终止符处

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

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

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

运算符优先级和执行顺序不一定是一回事。

*s1++ = *s2++

编译器计算如下:

  1. 编译器认为“++”具有最高的优先级。因为它是 post-increment operator,所以它只是记录了指针需要在 评估之后递增的事实表达式的完成。
  2. 编译器看到“*”运算符,告诉它应该取消引用 s2,并将其用作 RHS
  3. 同样在赋值的左侧,s1 的 char 被设置为 s2
  4. char 的值
  5. 编译器返回注意在表达式求值后需要递增指针并这样做。

即使 ++ 的优先级高于 *,它仍然最后完成。这里的优先级只是意味着必须对 指针 进行 post 递增操作,而不是对指针 处的

一元星号“*”运算符具有从右到左的关联,而不是作为后缀递增“++”运算符的从左到右的关联。因此,在此示例中首先评估一元星号。这与 LALR 解析器的工作方式有关。

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