为什么 ++ 运算符不在 = 运算符之前

Why is ++ operator not preceding = operator

为什么在这个例子中

*p++ = c;

是*p先等于c然后p加1。我查看了运算符优先级的 this table,它说“=”运算符在 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++ = c;

相当于

*p = c;
p = p + 1;

*++p = c;

相当于

p = p + 1;
*p = c;

++ 确实比 C 语言中的大多数其他运算符绑定得更紧密,但它的 pre-/post-fix 位置决定了 p 中的值发生了什么以及何时使用它。

++-- 的前缀和后缀形式同时具有 结果 副作用 .对于++x,表达式的结果x+1副作用x增加 1。对于 x++,表达式的 resultx 的当前值,而 side effectx 增加 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”的当前值。