【问题标题】:Explanation of output of a C program [duplicate]C程序输出的解释[重复]
【发布时间】:2015-10-25 14:10:48
【问题描述】:

以下程序给出输出:

hffltgpshfflt

谁能解释一下 postfix++、prefix++ 和 dereference(*) 运算符的运算符优先级如何决定这个输出?

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

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

  getchar();
  return 0;
}

【问题讨论】:

  • @JoachimPileborg 好的,在这里撤回关闭投票——在这种情况下你是对的,前缀 ++ 绑定到取消引用的 ptr。只是添加......为什么要写这样的代码?但是好吧,假设这是一个实验室示例或类似的东西......
  • @MartinJames:不是真的...
  • 只是添加我真的不得不手动放置括号(就像 Joachim 在他的回答中所做的那样)以理解它 not 在此示例中由两个 ++ 修改的相同内存位置.这绝对是没有人愿意在“生产”中看到的代码。 :)

标签: c language-lawyer operator-precedence


【解决方案1】:

一旦学习了operator precedence and associativity 规则就很容易了。

你的表达式++*ptr++ 等价于++*(ptr++) 等价于++(*(ptr++))

所以操作的顺序是

  1. 后自增运算符(返回指针 ptr 的旧值)
  2. 指针ptr的解引用(在指针递增之前)
  3. 取消引用结果的前缀增量,增加ptr指向的值,例如'g''h' 等。
  4. 指针 ptr 递增(实际上是第 1 步的一部分)

【讨论】:

    猜你喜欢
    • 2014-09-07
    • 1970-01-01
    • 2014-06-29
    • 1970-01-01
    • 2019-05-13
    • 1970-01-01
    • 2013-10-20
    • 1970-01-01
    • 2012-11-08
    相关资源
    最近更新 更多