Sto*_*ica 45

C和C++对前缀++的结果说了不同的话.在C++中:

[expr.pre.incr]

通过添加1来修改前缀++ 的操作数.操作数应该是可修改的左值.操作数的类型应该是cv bool以外的算术类型,或者是指向完全定义的对象类型的指针.结果是更新的操作数; 它是一个左值,如果操作数是一个位域,它是一个位域.表达式++ x相当于x + = 1.

所以++可以再次应用于结果,因为结果基本上只是递增的对象并且是左值.但是在C中:

6.5.3一元运营商

前缀增量或减量运算符的操作数应具有原子,限定或非限定的实数或指针类型,并且应为可修改的左值.

前缀++运算符的操作数的值递增.结果是增量后操作数的新值.

结果不是左值; 它只是增量的纯值.所以你不能应用任何需要左值的运算符,包括++.

如果你被告知C++和C是彼此的超集或子集,那么就知道情况并非如此.有许多差异使得断言错误.

  • @MarkAmery - 我很乐意提供它.但是,到目前为止,这些信息无法恢复.这是一个历史上的分歧,我不相信经常被讨论过. (4认同)
  • 我不是downvoter(我也不是C或C++开发者),但是有一个可能的原因是,这只是"为什么?" 从一个角度来看 - 规格如何不同,其影响是什么? - 并且错过了*潜在的*更有趣和更有启发性的因素:*激发*那些规范差异?C和C++之间的设计原则是否存在差异?或者C++中的特性使`++++ x`成为一个有用的东西,当它不在C中时允许它?这个概念"为什么?" 在任何一个答案中都没有解决. (2认同)

Bat*_*eba 14

在C中,它一直都是这样.可能是因为预增量++可以优化为许多CPU上的单个机器代码指令,包括20世纪70年代++开发概念时的那些指令.

在C++中虽然存在与运算符重载的对称性,但需要考虑.要匹配C,规范的预增量++将需要返回const &,除非您对用户定义和内置类型(这将是一种气味)有不同的行为.限制回归const &是一种设计.因此++,为了利用内置类型的任何CPU优化,以增加编译器复杂性为代价,从C规则中放松返回.