【问题标题】:Why is ++ operator not preceding = operator为什么 ++ 运算符不在 = 运算符前面
【发布时间】:2016-07-22 19:00:16
【问题描述】:

为什么在这个例子中

*p++ = c;

是 *p 首先等于 c 然后 p 增加一。我查看了this 运算符优先级表,它说“=”运算符在 15.place 中,++(后缀)是第一个。这对我来说没有意义。我试过这个的例子:

      char in_line[LINELNG];
      char *cp;
      int c;

      cp = &in_line[0];
      while((c = getc(stdin)) != EOF){
              if(cp == &in_line[LINELNG-1] || c == '\n'){
                      /*
                       * Insert end-of-line marker
                       */
                      *cp = 0;
                      if(strcmp(in_line, "stop") == 0 )
                              exit(EXIT_SUCCESS);
                      else
                              printf("line was %d characters long\n",
                                      (int)(cp-in_line));
                      cp = in_line;
              }
              else
                      *++cp = c;
      }

【问题讨论】:

  • 您是否想过一次只做一件事 - 让代码更易于阅读和理解。
  • 它们是不同的操作数。您对优先级的看法是正确的,但是赋值发生在 p 指向的值上,而增量在指针上。
  • 因为它是p++。增加 P AFTER 读取它的值。 ++p 将是“增加 p,然后读取它的值”
  • @EdHeal 我会这样做,但我在一本书中看到了这个例子,所以我想知道为什么它会这样工作。
  • 奇怪的是,您询问*p++ = c,但您的代码却包含*++cp = c。你确实意识到这些是不同的,对吧?

标签: c pointers variable-assignment assignment-operator operator-precedence


【解决方案1】:

伪代码扩展:

*p++ = c;

相当于

*p = c;
p = p + 1;

同时

*++p = c;

相当于

p = p + 1;
*p = c;

++ 确实比 C 中的大多数其他运算符绑定得更紧密,但它的前/后修复位置确切地确定了 p 中的值会发生什么以及何时使用它。

【讨论】:

  • 谢谢。但我不确定为什么人们不赞成我的问题。
  • 请注意您链接到的表中的右列。 right-to-left 优先级。所以*++p++*p 完全不同。 *++p 递增 p,然后取消引用它,而 ++*p 递增 p 指向的任何值,而不是 p 具有的任何值。
  • @Warix3,我不能代表其他人发言,但我注意到 Stack Overflow 上有一种趋势,即“简单”问题被否决。我们往往会忘记成为初学者的感觉,因此我们认为基础知识太琐碎而无法回应,并尝试羞辱新手询问它们。甚至 Marc B 也没有赞成你的回答(我不知道他是否反对)。我的观点是:不要对这里的反对票感到灰心。您提出了一个很好的问题,我希望您通过阅读有关 C 语言的操作顺序来跟进它。
【解决方案2】:

++-- 的前后缀形式既有结果,也有副作用。对于++x,表达式的结果x+1副作用x加1。对于x++表达式的em>resultx的当前值,副作用x加1。

表达式

*p++ = c

解析

(*(p++)) = (c)

评估好像写成1

t = p
*t = c
p = p + 1

需要注意的是*t = cp = p + 1 可以以任何顺序相互发生,并且p 只被评估一次。

同样,

*++p = c

被解析为

(*(++p)) = c

并评估为好像写成

t = p + 1
*t = c 
p = p + 1

注意事项与上述相同。


  1. 这是评估的逻辑描述,不一定是编译器生成的代码。编译器可能会安排一些事情,以便它不使用临时来存储 `p` 的当前值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-24
    • 2011-08-30
    • 2020-03-03
    • 2021-04-16
    相关资源
    最近更新 更多