-2

当有人询问后自增/自减和前自增/自减之间的区别时,答案通常是前缀版本将变量加一并返回变量的新值,而后缀版本将变量加一并且返回旧值。

在胡闹的时候,我发现所有这些行都是合法的:

int i = 1;
++i;
++++++++++++++i;
(++++++++++++++i)++;
(++++++(++++(++i)))++;
------i;
--++++--++----++i;
i+=++++++++++++++i+i++-i--; 

但以下行都不合法:

i++++;
++i++;
--i--;

如果我假设前缀版本通过引用返回,这一切都是有道理的(即使是最后一个示例,因为后缀的优先级高于前缀)。

前缀版本返回引用而后缀版本返回值的假设/实现是否正确?对于 pre/post inc/decrement 运算符,是否还有其他我不知道的细微行为差异?

4

4 回答 4

2

这一切都是合法的:

不,这不合法。以这种方式多次写入变量是未定义的行为。它在语法上是正确的,并且可以编译,但它肯定是不合法的。

于 2011-06-29T22:50:11.843 回答
1

在 C++ 中,前缀递增/递减表达式“返回”左值,后缀版本返回右值。在 C 中,两种形式都返回右值。

但是,请注意,如果您尝试在两个序列点之间多次写入变量,则行为未定义。因此,无论如何,区别并不重要。

于 2011-06-29T22:54:51.483 回答
0

想到的一个是在同一语句中至少使用两次变量的常见编码错误,其中至少有一个实例应用了前/后增量:

i = i++;
于 2011-06-29T22:47:26.220 回答
0

前缀版本返回引用和后缀版本返回值的假设/实现是否正确

不,你为什么会这样假设?它是一个内置的运算符,编译器可以根据需要实现它。

您的“合法”示例可以编译,但会产生未定义的行为,因为您在没有序列点的情况下多次读取和写入同一个变量。

于 2011-06-29T22:48:31.967 回答