C程序输出说明

C程序输出说明,c,language-lawyer,operator-precedence,C,Language Lawyer,Operator Precedence,以下程序给出输出: hffltgpshfflt 有人能解释一下后缀++、前缀++和取消引用(*)运算符的运算符优先级是如何决定此输出的吗 #include<stdio.h> int main() { char arr[] = "geeksforgeeks"; char *ptr = arr; while(*ptr != '\0') ++*ptr++; printf("%s %s", arr, ptr); getchar(); return 0;

以下程序给出输出:

hffltgpshfflt
有人能解释一下后缀++、前缀++和取消引用(*)运算符的运算符优先级是如何决定此输出的吗

#include<stdio.h>
int main()
{
  char arr[]  = "geeksforgeeks";
  char *ptr  = arr;

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

  getchar();
  return 0;
}
#包括
int main()
{
char arr[]=“geeksforgeks”;
char*ptr=arr;
而(*ptr!='\0')
++*ptr++;
printf(“%s%s”,arr,ptr);
getchar();
返回0;
}

一旦学会了规则就很容易了

您的表达式
++*ptr++
相当于
++*(ptr++)
,后者相当于
++(*(ptr++)

所以操作的顺序是

  • 后增量运算符(返回指针的旧值
    ptr
  • 指针的解引用
    ptr
    (指针递增之前)
  • 解引用结果的前缀增量,增加由
    ptr
    指向的值,例如将
    'g'
    变为
    'h'
  • 指针
    ptr
    递增(实际上是步骤1的一部分)

  • @JoachimPileborg好的,在这里收回接近票数的投票——在本例中,您是对的,前缀++绑定到取消引用的ptr。只是加上。。。他妈的为什么要写这样的代码?但是好吧,假设这是一个实验室的例子或者类似的东西…@MartinJames:不是真的…只是添加我真的需要手动插入括号(就像Joachim在他的回答中所做的那样)来理解它不是这个例子中两个
    ++
    修改的相同内存位置。这绝对是任何人都不想在“生产”中看到的代码:)可能的副本。同样地,