编译器如何解释增量前/减量和增量后/减量

How the compiler interprets preincrement/decrement and postincrement/decrement

本文关键字:减量 何解释 解释 编译器      更新时间:2023-10-16

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

在闲逛的时候,我发现所有这些线路都是合法的:

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

但以下线路都不合法:

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

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

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

所有这些都是合法的:

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

在C++中,前缀递增/递减表达式"return"lvalues和后缀版本返回rvalues。在C中,两种形式都返回右值。

但是,请注意,如果您试图在两个序列点之间多次写入变量,则行为是未定义的。所以这种区别其实并不重要。

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

i = i++;

假设/认识到前缀版本返回引用,并且后缀版本返回一个值正确的

没有。你为什么会这么想?它是一个内置的运算符,编译器可以随心所欲地实现它。

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