为什么多个增量/减量在C++中有效但在C中不有效?

mko*_*ler 6 c c++ incompatibility lvalue language-lawyer

测试.(C/CPP)

#include <stdio.h>

int main(int argc, char** argv)
{
  int a = 0, b = 0;
  printf("a = %d, b = %d\n", a, b);
  b = (++a)--;
  printf("a = %d, b = %d\n", a, b);

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

如果我将上面的内容保存为.cpp文件,它会在执行时编译并输出:

a = 0, b = 0
a = 0, b = 1
Run Code Online (Sandbox Code Playgroud)

但是,如果我将其保存为.c文件,我会收到以下错误:

test.c:7:12: error: lvalue required as decrement operator.
Run Code Online (Sandbox Code Playgroud)

(++a)手术前不应该解决(newValue)--手术吗?有没有人对此有任何见解?

oua*_*uah 13

在C中,前缀和后缀增量/减量运算符的结果不是左值.

在C++中,后缀增量/减量运算符的结果也不是左值,但前缀增量/减量运算符的结果是左值.

现在做类似于(++a)--C++的事情是未定义的行为,因为您在两个序列点之间修改对象值两次.

编辑:跟进@ bames53评论.它是C++ 98/C++ 03中未定义的行为,但C++ 11中关于序列点概念的变化现在定义了这个表达式.

  • C++ 11取消了序列点,而只需要对读取和修改进行排序,它们位于`(++ a) - `中.见[这里](http://stackoverflow.com/q/10655290/365496) (3认同)