cod*_*gon 40 c c++ language-lawyer
为什么是
int main()
{
int i = 0;
++++i;
}
Run Code Online (Sandbox Code Playgroud)
有效的C++但无效的C?
Sto*_*ica 45
C和C++对前缀++的结果说了不同的话.在C++中:
通过添加1来修改前缀++ 的操作数.操作数应该是可修改的左值.操作数的类型应该是cv bool以外的算术类型,或者是指向完全定义的对象类型的指针.结果是更新的操作数; 它是一个左值,如果操作数是一个位域,它是一个位域.表达式++ x相当于x + = 1.
所以++可以再次应用于结果,因为结果基本上只是递增的对象并且是左值.但是在C中:
前缀增量或减量运算符的操作数应具有原子,限定或非限定的实数或指针类型,并且应为可修改的左值.
前缀++运算符的操作数的值递增.结果是增量后操作数的新值.
结果不是左值; 它只是增量的纯值.所以你不能应用任何需要左值的运算符,包括++.
如果你被告知C++和C是彼此的超集或子集,那么就知道情况并非如此.有许多差异使得断言错误.
Bat*_*eba 14
在C中,它一直都是这样.可能是因为预增量++
可以优化为许多CPU上的单个机器代码指令,包括20世纪70年代++
开发概念时的那些指令.
在C++中虽然存在与运算符重载的对称性,但需要考虑.要匹配C,规范的预增量++
将需要返回const &
,除非您对用户定义和内置类型(这将是一种气味)有不同的行为.限制回归const &
是一种设计.因此++
,为了利用内置类型的任何CPU优化,以增加编译器复杂性为代价,从C规则中放松返回.