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

时间:2016-07-22 19:00:17

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

为什么在这个例子中

*p++ = c;

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

      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;
      }

2 个答案:

答案 0 :(得分:4)

伪代码扩展:

*p++ = c;

相当于

*p = c;
p = p + 1;

,而

*++p = c;

相当于

p = p + 1;
*p = c;

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

答案 1 :(得分:1)

++--的前后形式同时包含结果副作用。对于++x,表达式的结果x+1副作用x增加1。 x++,表达式的结果x的当前值,副作用x增加的*p++ = c 1.

表达式

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

解析

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

评估,好像写成 1

*t = c

注意p = p + 1p可以按任何顺序相互发生,*++p = c 只评估一次。

同样,

(*(++p)) = c

被解析为

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

并进行评估,就好像写成

一样
userMarker = new MarkerOptions().position(latLng).title("Current Location");
mMap.addMarker(userMarker);

与上述相同的警告。

<小时/>

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