左值?正确的价值?
如果您在谈论lvalues和rvalues,那么作为 lvalue 或 rvalue 的属性适用于表达式的结果,这意味着您必须考虑--iand的结果i--。在 C 语言中, --i和i--都是右值。因此,您的问题是基于 C 语言领域的不正确前提。--i不是C 中的左值。我不知道您要通过引用 C99 标准来说明什么,因为它明确指出两者都不是左值。此外,还不清楚i--返回 a是什么意思void。不,内置的后缀--永远不会返回void。
--i左值与右值的区别i--仅存在于 C++ 中。
无论如何,如果您只查看表达式语句--i;,i--;您就不会使用这些表达式的结果。你正在丢弃它们。使用独立的唯一一点--i是i--它们的副作用(减量i)。但是由于它们的副作用是相同的,因此完全可以预期生成的代码是相同的。
如果您想查看--i和i--表达式之间的区别,您必须使用它们的结果。例如
int a = --i;
int b = i--;
将为每个初始化生成不同的代码。
这个例子与他们结果的左值或右值无关。如果你想从那一侧观察差异(如我上面所说,它只存在于 C++ 中),你可以试试这个
int *a = &--i;
int *b = &i--;
第一次初始化将在 C++ 中编译(因为结果是左值),而第二次初始化不会编译(因为结果是右值并且您不能将内置的一元&应用于右值)。
该规范背后的基本原理是相当明显的。由于--i计算结果为 的新值i,因此完全有可能使此运算符返回对i自身的引用作为其结果(与 C 相比,C++ 语言更喜欢尽可能返回左值)。同时,i--需要返回 的旧值i。因为当我们开始分析结果时哦i--,i它本身很可能持有新值,所以我们不能返回对i. 我们必须i在一些辅助临时位置保存(或重新创建)旧值并将其作为结果返回i--. 该临时值只是一个值,而不是一个对象。它不需要驻留在内存中,这就是它不能是左值的原因。