左值?正确的价值?
如果您在谈论lvalues和rvalues,那么作为 lvalue 或 rvalue 的属性适用于表达式的结果,这意味着您必须考虑--i
and的结果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--
. 该临时值只是一个值,而不是一个对象。它不需要驻留在内存中,这就是它不能是左值的原因。