【问题标题】:Pointer in C (while(*s1++ = *s2++))C 中的指针 (while(*s1++ = *s2++))
【发布时间】:2016-08-19 11:04:37
【问题描述】:

对于下面的程序

#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 中看到类似的帖子,但他们没有解释 * 运算符如何比后缀运算符具有更高的优先级。但实际上,后缀运算符的优先级高于 * (取消引用)运算符。优先级表供我们参考here

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

BndiaBIdiaBIXia 

【问题讨论】:

  • 不要使问题无效...但是您为什么要使用此代码?
  • *s1++*(s1++)
  • postincrement 优先级在这里并不重要,因为它是 postincrement。因此,简而言之,编译器首先意识到它需要在其他所有操作完成后递增指针。 表达式被评估之后,增量仍然完成。
  • 您的困惑可能是因为对链接问题的(已接受)答案完全是错误的(就像该问题的大多数其他答案一样)。
  • 这被称为K&amp;R strcpy()(没有printf,只有“空”循环:while(*s1++ = *s2++) {;}

标签: c pointers operator-precedence


【解决方案1】:

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

*s1++ = *s2++

由编译器评估如下:

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

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

【讨论】:

    【解决方案2】:

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

    分解条件

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

    所以条件判断指针s2是否不指向空字符。

    BIX 就是这种情况。第三次迭代,s2 将位于字符串文字 BIX 的空终止符处。

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

    注意:您可能会将=== 混淆,并且您实际上是在寻找不匹配的内容;这是一个很常见的错误。

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-05-12
          • 2013-01-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多