什么是输出并解释如何?

时间:2016-06-07 14:09:15

标签: c post-increment pre-increment associativity operator-precedence

我对以下2个程序的输出感到困惑。有人可以解释优先级和关联性规则吗?

计划1:

char arr[] = "geeksforgeeks";
char *p = arr;
*p++;
printf(" %c", *p);

计划2:

char arr[]  = "geeksforgeeks";
char *ptr  = arr;

while(*ptr != '\0')
    ++*ptr++;
printf("%s %s", arr, ptr);

1 个答案:

答案 0 :(得分:1)

首先让我们将您的程序简化为可比较的东西:

//# sourceMappingURL=angular.min.js.map

接下来让我们看一下operator precedence并假设我们期望发生的事情:

  1. 后缀增量(发生1 st ,因为它具有三个运算符的最高优先级)
  2. 取消引用(发生2 nd 因为优先级2的运算符从右向左关联)
  3. 前缀增量(最后发生,因为它是最低优先级的最左边的运算符)
  4. 所以我们期望char arr[] = "geeksforgeeks"; char* p = arr; *p++; printf("%s %c\n", arr, *p); char* ptr = arr; ++*ptr++; printf("%s %c\n", arr, *ptr); 除了将*p++提升到2 nd 位置之外没有任何影响,因为:

    1. 后缀增量p
    2. 取消引用p的地址而不增加地址
    3. 我们希望p增加当前字符并将++*ptr++提升到2 nd 位置,因为:

      1. 后缀增量ptr
      2. 取消引用ptr的地址而不增加地址
      3. 在地址ptr
      4. 处增加char的值

        通过查看此Live Example,您可以看到我们的假设是正确的,我们甚至会收到警告:

          

        未使用计算值[-Wunused-value] ptr

        我们的结果是:

          

        geeksforgeeks e
          heeksforgeeks e