为什么C ++接受多个前缀但不接受变量的后缀

时间:2012-07-26 23:28:17

标签: c++ increment prefix postfix-notation decrement

在研究Can you have a incrementor and a decrementor on the same variable in the same statement in c

我发现你可以在一个变量上有几个前缀增量/减量运算符,但只有一个后缀

例如:

++--++foo; // valid
foo++--++; // invalid
--foo++;   // invalid

为什么会这样?

2 个答案:

答案 0 :(得分:9)

这是因为在C ++(但不是C)中,++x的结果是lValue,这意味着它是可分配的,因此可以链接。

但是,x++的结果不是lValue,而是prValue,这意味着它无法分配,因此无法链接。

答案 1 :(得分:6)

在C ++语言中,前缀增量/减量运算符返回 lvalues ,而后缀值返回 rvalues 。同时,所有修改运算符都需要左值参数。这意味着前缀增量/减量的结果可以传递给需要左值参数的任何其他附加运算符(包括额外的增量/减量)。

出于与C ++相同的原因,你可以编写像这样的代码

int i = 0;
int *p = &++i;

将增加i并使p指向i。一元&需要左值操作数,这就是为什么它可以使用前缀++的结果(但不能使用后缀一个)。

应用于同一对象的具有多个内置前缀增量/减量的表达式会产生未定义的行为,但它们仍然是格式良好的(即“可编译”)。

++foo--之类的表达式无效,因为在C ++中,后缀运算符的优先级高于前缀1。大括号可以改变这一点。例如,(++foo)--是一个格式良好的表达式,虽然会再次导致未定义的行为。